HTTP协议

HTTP: 超文本传输协议( HyperText Transfer Protocol )

1.1 为什么需要协议

  • 通信需要明确的边界->开始和结束
  • 需要明确能够携带的信息->数据类型, 数据长度等等

1.2 协议里面有什么

以一个POST请求为例

1
2
3
4
5
6
POST /hello HTTP/1.1
Host: www.baidu.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

name=zhangsan

在这个请求中, 我们可以看到有以下几个部分

  • 请求行: POST /hello HTTP/1.1 ,包含了请求方法, 请求路径, 协议版本
  • kv对形式的几组数据
  • 空行,表示请求头部结束
  • 请求体,包含了请求体信息

kv对即请求头中一般包含有

  • Host: 请求的主机地址
  • Content-Type: 请求体的类型
  • Content-Length: 请求体的长度

也就是说, 协议中包含了三个部分

  • 请求行
  • 请求头
  • 请求体

对于返回, 也是类似的, 也包含了三个部分

1
2
3
4
5
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 11

hello world

区别在于,返回的第一行是状态行, 包含了协议版本, 状态码, 状态信息

1.3 使用原生Go发送HTTP请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
"io/ioutil"
"net/http"
)

func main() {
resp, err := http.Get("http://www.baidu.com")
if err != nil {
fmt.Println("get failed, err:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("read from resp.Body failed, err:", err)
return
}
fmt.Println(string(body))
}