go的request学习

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")
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值