Bootstrap

http.Request

请求报文结构

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
;