0%

Go http请求

  • URL
  • Header
  • Body

    http 请求报文

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=456
  • r.URL.Query(),会提供查询字符串对应的 map[string][]string

URL Fragment
浏览器在发送请求时会把 fragment 字段去掉,交给 JavaScript 解析,一般用来在页面内定位(通过 html 标签的 id 定位)

  • 请求和响应(Request、Response)的 headers 是通过 Header 类型来描述的,它是一个 map,用来表述 HTTP Header 里的 Key-Value 对。
  • Header map 的 key 是 string 类型,value 是 []string
  • 设置 key 的时候会创建一个空的 []string 作为 value,value 里面第一个元素就是新 header 的值
  • 为指定的 key 添加一个新的 header 值,执行 append 操作即可

使用示例:

1
2
3
4
5
http.HandleFunc("/header", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, r.Header) // r.Header 得到 map
fmt.Fprintln(w, r.Header["Accept-Encoding"]) // 得到 []string
fmt.Fprintln(w, r.Header.Get("Accept-Encoding")) // 得到 string
})

使用 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
2
3
4
5
6
http.HandleFunc("/body", func(w http.ResponseWriter, r *http.Request) {
length := r.ContentLength // 获取请求报文中的 ContentLength
body := make([]byte, length)
r.Body.Read(body) // 把请求报文的 Body 部分读入到 []byte 中
fmt.Fprintln(w, string(body)) // 把得到的 Body 写回到 response 报文的 Body 中
})

使用 REST Cient 发送 POST 请求:

1
2
3
4
5
6
7
POST http://localhost:8080/body HTTP/1.1
Content-Type: application/json

{
"name": "wxy",
"time": {{$datetime rfc1123}}
}

响应报文: