Request 结构体
重要字段:
- URL
- Header
- Body
- Form、PostForm、MultipartForm
URL
URL 的一般形式:[scheme:][//[userinfo@]host][/]path[?query][#fragment]
不以斜杠开头的 URL 为不透明 URL:scheme:opaque[?query][#fragment]
URL Query
r.URL.RawQuery
会提供实际查询的字符串。
例如:http://www.example.com/post?id=123&thread_id=456
它的 RawQuery 的值就是 id=123&thread_id=456r.URL.Query()
,会提供查询字符串对应的 map[string][]string
URL Fragment
浏览器在发送请求时会把 fragment 字段去掉,交给 JavaScript 解析,一般用来在页面内定位(通过 html 标签的 id 定位)
Header
- 请求和响应(Request、Response)的 headers 是通过 Header 类型来描述的,它是一个 map,用来表述 HTTP Header 里的 Key-Value 对。
- Header map 的 key 是 string 类型,value 是 []string
- 设置 key 的时候会创建一个空的 []string 作为 value,value 里面第一个元素就是新 header 的值
- 为指定的 key 添加一个新的 header 值,执行 append 操作即可
使用示例:
1 | http.HandleFunc("/header", func(w http.ResponseWriter, r *http.Request) { |
使用 REST Client 发送请求报文:GET http://localhost:8080/header HTTP/1.1
响应报文:
Body
- 请求和响应的 bodies 都是使用 Body 字段来表示的
- Body 是一个 io.ReadCloser 接口,继承了两个接口:
- 一个 Reader 接口
- 一个 Closer 接口
- Reader 接口定义了一个
Read()
方法:- 参数:[]byte
- 返回:byte 的数量、可选的错误
- Closer 接口定义了一个
Close()
方法:- 没有参数,返回可选的错误
使用示例:
1 | http.HandleFunc("/body", func(w http.ResponseWriter, r *http.Request) { |
使用 REST Cient 发送 POST 请求:
1 | POST http://localhost:8080/body |
响应报文: