美文网首页
http.Request

http.Request

作者: JunChow520 | 来源:发表于2021-12-29 18:18 被阅读0次
    请求报文结构

    HTTP请求报文包含三部分

    报文组成 名称 描述
    请求行 request line 包含请求方法、URL、HTTP版本,定义了客户端与服务器交互的请求方法。
    请求头 request header 包含HTTP请求首部字段
    请求体 request body 请求主体或实体,GET请求无提交表单数据请求实体为空,POST请求则包含表单数据。

    http.Request

    net/http包封装了http.Request结构体表示HTTP请求报文,用于获取一次HTTP请求的所有信息。

    type Request struct {
        Method string// 请求方法
        URL *url.URL// 请求地址
        Proto      string // 协议版本 "HTTP/1.0"
        ProtoMajor int    // 1 协议主版本
        ProtoMinor int    // 0 协议次版本
        Header Header// 请求头
        Body io.ReadCloser// 请求体
        GetBody func() (io.ReadCloser, error)// 获取请求体
        ContentLength int64// 内容长度
        TransferEncoding []string// 传输编码
        Close bool// 连接是否关闭
        Host string// 服务器主机地址
        Form url.Values// GET表单
        PostForm url.Values// POST表单
        MultipartForm *multipart.Form// 上传表单
        Trailer Header
        RemoteAddr string// 远程客户端地址
        RequestURI string// 请求URI
        TLS *tls.ConnectionState// HTTPS
        Cancel <-chan struct{}
        Response *Response// 响应
        ctx context.Context// 上下文对象
    }
    
    字段 说明
    Method 请求方法,可选GET、POST、PUT等。若客户端请求方法为空字符串则默认为GET请求。
    URL 用于指定被请求的服务端请求URI或客户端请求访问的URL,对客户端来说用于记录要连接的服务端地址。
    Proto 协议版本
    Header 请求头
    Body 请求体,若为空则表示GET请求。
    ContentLength 请求体字节大小,若等于0则请求体body为空可表示为unknown,若等于-1也可以表示unknown。
    Form 表单字段

    例如:获取HTTP请求信息

    func main() {
        //注册路由
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            fmt.Printf("Proto: %+v\n", r.Proto)
            fmt.Printf("ProtoMajor: %+v\n", r.ProtoMajor)
            fmt.Printf("ProtoMinor: %+v\n", r.ProtoMinor)
            fmt.Printf("URL: %+v\n", r.URL)
            fmt.Printf("RequestURI: %+v\n", r.RequestURI)
            fmt.Printf("RemoteAddr: %+v\n", r.RemoteAddr)
            fmt.Printf("Host: %+v\n", r.Host)
            fmt.Printf("Method: %+v\n", r.Method)
            fmt.Printf("ContentLength: %+v\n", r.ContentLength)
        })
        //监听端口接收连接
        if err := http.ListenAndServe(":8900", nil); err != nil {
            panic(err)
        }
    }
    
    Proto: HTTP/1.1
    ProtoMajor: 1
    ProtoMinor: 1
    URL: /
    RequestURI: /
    RemoteAddr: 127.0.0.1:8110
    Host: 127.0.0.1:8900
    Method: GET
    ContentLength: 0
    

    http.Header

    请求头和响应头都通过Header类型标识

    type Header map[string][]string
    
    • http.Header是一个键值对字典,键是字符串,值是字符串切片。
    • http.Header提供了增删改查方法用于对请求进行读取和设置

    Header对象提供Get()可通过传入对应的字段名获取值,用户读取或打印请求头字段值。

    func (h Header) Get(key string) string {
        return textproto.MIMEHeader(h).Get(key)
    }
    

    例如:在浏览器中打印请求头中User-Agent字段的值

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        str := r.Header.Get("User-Agent")
        w.Write([]byte(str)) 
    })
    http.ListenAndServe(":8080", nil)
    
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
    

    相关文章

      网友评论

          本文标题:http.Request

          本文链接:https://www.haomeiwen.com/subject/uielhltx.html