func (r *Request) Body(reader io.Reader) *Request {
	r.Use(body.Reader(reader))
	return r
}
Body defines the request body based on a io.Reader stream.
package gentleman
import (
	"errors"
	"io"
	"net"
	"net/http"
	"time"
	"gopkg.in/h2non/gentleman.v2/context"
	"gopkg.in/h2non/gentleman.v2/middleware"
	"gopkg.in/h2non/gentleman.v2/mux"
	"gopkg.in/h2non/gentleman.v2/plugin"
	"gopkg.in/h2non/gentleman.v2/plugins/body"
	"gopkg.in/h2non/gentleman.v2/plugins/bodytype"
	"gopkg.in/h2non/gentleman.v2/plugins/cookies"
	"gopkg.in/h2non/gentleman.v2/plugins/headers"
	"gopkg.in/h2non/gentleman.v2/plugins/multipart"
	"gopkg.in/h2non/gentleman.v2/plugins/query"
	"gopkg.in/h2non/gentleman.v2/plugins/url"
)
const (
	UserAgent = "gentleman/" + Version
)
var (
	DialTimeout = 30 * time.Second
	DialKeepAlive = 30 * time.Second
	TLSHandshakeTimeout = 10 * time.Second
	RequestTimeout = 60 * time.Second
	DefaultDialer = &net.Dialer{
		Timeout:   DialTimeout,
		KeepAlive: DialKeepAlive,
	}
	DefaultTransport = NewDefaultTransport(DefaultDialer)
)
type Request struct {
	dispatched bool
	Client *Client
	Context *context.Context
	Middleware middleware.Middleware
}
func NewRequest() *Request {
	ctx := context.New()
	ctx.Client.Transport = DefaultTransport
	ctx.Request.Header.Set("User-Agent", UserAgent)
	return &Request{
		Context:    ctx,
		Middleware: middleware.New(),
	}
}
func (r *Request) SetClient(cli *Client) *Request {
	r.Client = cli
	r.Context.UseParent(cli.Context)
	r.Middleware.UseParent(cli.Middleware)
	return r
}
func (r *Request) Mux() *mux.Mux {
	mx := mux.New()
	r.Use(mx)
	return mx
}
func (r *Request) Method(method string) *Request {
	r.Middleware.UseRequest(func(ctx *context.Context, h context.Handler) {
		ctx.Request.Method = method
		h.Next(ctx)
	})
	return r
}
func (r *Request) URL(uri string) *Request {
	r.Use(url.URL(uri))
	return r
}
func (r *Request) BaseURL(uri string) *Request {
	r.Use(url.BaseURL(uri))
	return r
}
func (r *Request) Path(path string) *Request {
	r.Use(url.Path(path))
	return r
}
func (r *Request) AddPath(path string) *Request {
	r.Use(url.AddPath(path))
	return r
}
func (r *Request) Param(name, value string) *Request {
	r.Use(url.Param(name, value))
	return r
}
func (r *Request) Params(params map[string]string) *Request {
	r.Use(url.Params(params))
	return r
}
func (r *Request) SetQuery(name, value string) *Request {
	r.Use(query.Set(name, value))
	return r
}
func (r *Request) AddQuery(name, value string) *Request {
	r.Use(query.Add(name, value))
	return r
}
func (r *Request) SetQueryParams(params map[string]string) *Request {
	r.Use(query.SetMap(params))
	return r
}
func (r *Request) SetHeader(name, value string) *Request {
	r.Use(headers.Set(name, value))
	return r
}
func (r *Request) AddHeader(name, value string) *Request {
	r.Use(headers.Add(name, value))
	return r
}
func (r *Request) SetHeaders(fields map[string]string) *Request {
	r.Use(headers.SetMap(fields))
	return r
}
func (r *Request) DelHeader(name string) *Request {
	r.Use(headers.Del(name))
	return r
}
func (r *Request) AddCookie(cookie *http.Cookie) *Request {
	r.Use(cookies.Add(cookie))
	return r
}
func (r *Request) AddCookies(data []*http.Cookie) *Request {
	r.Use(cookies.AddMultiple(data))
	return r
}
func (r *Request) CookieJar() *Request {
	r.Use(cookies.Jar())
	return r
}
func (r *Request) Type(name string) *Request {
	r.Use(bodytype.Set(name))
	return r
}