request总的来说就是 接受一个来自服务端或者客户端的http请求 看看request的结构体定义
type Request struct { Method string //方法可以是 (GET, POST, PUT, etc.). //客户端请求一个空的string,那他就是一个get URL *url.URL // 指定被请求的URI(服务端请求)或URL来访问(客户机请求)。 //对客户端请求来说 ,就是记录的要连接的服务端的地址 Proto string // "HTTP/1.0" ProtoMajor int // 1 ProtoMinor int // 0 // Header contains the request header fields either received // by the server or to be sent by the client. // // If a server received a request with header lines, // // Host: example.com // accept-encoding: gzip, deflate // Accept-Language: en-us // fOO: Bar // foo: two // // then // // Header = map[string][]string{ // "Accept-Encoding": {"gzip, deflate"}, // "Accept-Language": {"en-us"}, // "Foo": {"Bar", "two"}, // } // Header Header Body io.ReadCloser // request的body信息部分 空的request表示没有body ,get 请求 //之后 http的发起段client要调用 close方法 结束这次request //由于服务端通常都是处理的request body部分是非空的 ,所以会反馈一个EOF ,服务端会直接关闭这个 //request ,不会做任何实质性的处理 ContentLength int64 // request body的大小 ,bytes //一般 >=0 , -1 表示 unknown // 如果 =0 ,body 不为空,也表示 unknown TransferEncoding []string //TransferEncoding 列举了 transfer 的编码 从最外层到最内层 // 空值表示 "identity" encoding. // chunked encoding 是可以自动添加和删除的 Close bool // 当回复了request之后结束这次链接 // 对服务端来说就是回复了这个 request ,对客户端来说就是收到了 response //对服务端 Handlers 会自动调用关闭 close //对客户端 如果设置了tcp的长连接 Transport.DisableKeepAlives=false ,那么不会关闭 // Transport.DisableKeepAlives=true 不保持长连接 就 close掉 // For server requests Host specifies the host on which the // URL is sought. Per RFC 2616, this is either the value of // the "Host" header or the host name given in the URL itself. // It may be of the form "host:port". // // For client requests Host optionally overrides the Host // header to send. If empty, the Request.Write method uses // the value of URL.Host. Host string //服务器请求指定的主机 // host 头信息或者名字 是已url的方式给出 或者是 "host:port". //客户端请求主机选择覆盖主机头发送。如果空,使用URL.Host的价值。 // Form contains the parsed form data, including both the URL // field's query parameters and the POST or PUT form data. // This field is only available after ParseForm is called. // The HTTP client ignores Form and uses Body instead. Form url.Values // PostForm contains the parsed form data from POST, PATCH, // or PUT body parameters. // // This field is only available after ParseForm is called. // The HTTP client ignores PostForm and uses Body instead. PostForm url.Values // MultipartForm is the parsed multipart form, including file uploads. // This field is only available after ParseMultipartForm is called. // The HTTP client ignores MultipartForm and uses Body instead. MultipartForm *multipart.Form // Trailer specifies additional headers that are sent after the request // body. // // For server requests the Trailer map initially contains only the // trailer keys, with nil values. (The client declares which trailers it // will later send.) While the handler is reading from Body, it must // not reference Trailer. After reading from Body returns EOF, Trailer // can be read again and will contain non-nil values, if they were sent // by the client. // // For client requests Trailer must be initialized to a map containing // the trailer keys to later send. The values may be nil or their final // values. The ContentLength must be 0 or -1, to send a chunked request. // After the HTTP request is sent the map values can be updated while // the request body is read. Once the body returns EOF, the caller must // not mutate Trailer. // // Few HTTP clients, servers, or proxies support HTTP trailers. Trailer Header // 当body部分发送完成之后 Trailer 才会添加到头信息中 RemoteAddr string //服务端会记录发送request的服务端IP //当调用一个处理程序之前 httpserver会设置 该字段RemoteAddr 格式,IP:port //客户端没有该字段 // RequestURI is the unmodified Request-URI of the // Request-Line (RFC 2616, Section 5.1) as sent by the client // to a server. Usually the URL field should be used instead. // It is an error to set this field in an HTTP client request. RequestURI string // TLS allows HTTP servers and other software to record // information about the TLS connection on which the request // was received. This field is not filled in by ReadRequest. // The HTTP server in this package sets the field for // TLS-enabled connections before invoking a handler; // otherwise it leaves the field nil. // This field is ignored by the HTTP client. TLS *tls.ConnectionState // Cancel is an optional channel whose closure indicates that the client // request should be regarded as canceled. Not all implementations of // RoundTripper may support Cancel. // // For server requests, this field is not applicable. // // Deprecated: Use the Context and WithContext methods // instead. If a Request's Cancel field and context are both // set, it is undefined whether Cancel is respected. Cancel <-chan struct{} Response *Response // 这个字段只有在重定向的时候才会被调用 ,也只使用在客户端的重定向方法调用
func NewRequest(method, urlStr string, body io.Reader) (*Request, error) func ReadRequest(b *bufio.Reader) (*Request, error) func (r *Request) AddCookie(c *Cookie) func (r *Request) BasicAuth() (username, password string, ok bool) func (r *Request) Context() context.Context func (r *Request) Cookie(name string) (*Cookie, error) func (r *Request) Cookies() []*Cookie func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) func (r *Request) FormValue(key string) string func (r *Request) MultipartReader() (*multipart.Reader, error) func (r *Request) ParseForm() error func (r *Request) ParseMultipartForm(maxMemory int64) error func (r *Request) PostFormValue(key string) string func (r *Request) ProtoAtLeast(major, minor int) bool func (r *Request) Referer() string func (r *Request) SetBasicAuth(username, password string) func (r *Request) UserAgent() string func (r *Request) WithContext(ctx context.Context) *Request func (r *Request) Write(w io.Writer) error func (r *Request) WriteProxy(w io.Writer) error //看一个简单的获取UserAgent头信息的方法 ,其他的类似 func (r *Request) UserAgent() string { return r.Header.Get("User-Agent") }