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