这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
HTTP消息
- HTTP Request 和 HTTP Response(请求和响应)
- 它们具有相同的结构
- 请求(响应)行
- 0个或多个Header
- 空行
- 可选的消息体
- 例子:
- Get /Protocols/rfc2616/rfc2616.html HTTP/1.1
- Host: www.w3.org
- User-Agent: Mozilla/5.0
- (空行)
请求(Request)
-
Request(是个 struct),代表了客户端发送的 HTTP 请求消息
-
重要的字段:
- URL
- Header
- Body
- Form、PostForm、MultipartForm
-
也可以通过 Request 的方法访问请求中的 Cookie、URL、User Agent 等信息
-
Request 既可以代表发送到服务器的请求,又可代表客户端发出的请求
-
请求的URL
- Request 的 URL字段就代表了请求行(请求信息第一行)里面的部分内容
- URL 字段是指向 url.URL 类型的一个指针,url.URL是一个struct:
type URL struct {
Scheme string
Opaque string
User *Userinfo
Host string
Path string
RawQuery string
Fragment string
}
- URL Fragment
- 如果从浏览器发出的请求,那么无法提取出 Fragment 字段的值
- 浏览器在发送请求时会把 fragment 部分去掉
- 但不是所有的请求都是从浏览器发出的(例如从 HTTP 客户端包)
- Request Header
- 请求和响应(Request\Response)的 headers 是通过 Header 类型来描述的,它是一个 map,用来表述 HTTP Header里的 Key-Value 对
- Header map 的 key 是 string 类型,value 是 []string
- 设置 key 的时候会创建一个空的 []string 作为 value,value 里面第一个元素就是新 header 的值
- 为指定的 key 添加一个新的 header值,执行 append 操作即可
- r.Header : 返回 map
- r.Header["Accept-Encoding"] : 返回:[gzip, deflate]([]string 类型)
- r.Header.Get("Accept-Encoding") : 返回 gzip, deflate(string 类型)
- Request Body
- 请求和响应的 bodies 都是使用 Body 字段来表示的
- Body 是一个 io.ReadCloser 接口
- 一个 Reader 接口
- 一个 Closer 接口
- Reader 接口定义了一个 Open 方法:
- 参数: []byte
- 返回: byte 的数量、可选的错误
- Closer 接口定义了一个 Close 方法:
- 没有参数,返回可选的错误
- 要想读取 Request Body 的内容,需要调用 Body.Read 方法
查询参数
- URL Query (http://www.***.com/post?id=123&thread_id=456)
- r.URL.RawQuery 会提供实际查询的原始字符串
- 上例的 RawQuery 的值就是 id=123&thread_id=456
- r.URL.Query(),会提供查询字符串对应的 map[string][]string