HTTP/1.1 协议简介

Posted by Matt Reach on April 9, 2018

简介

HTTP 是一种传输协议,全称(HyperText Transfer Protocol,超文本传输协议)。 HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)的应用层协议,早在 1990 年万维网兴起的时候,就得到了应用,截至目前可谓是使用最为广泛的协议了,因此掌握这个协议是很有必要。

该协议的具体内容可参考 RFC2616.

请求

协议里规定的请求方法有: OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT 这几种,客户端开发以 GET、POST 最为常见。

HTTP 协议将报文分为三个部分,分别是:请求行,请求头,请求体。一起来看一个完整的 POST 请求:

1
2
3
4
5
6
7
8
9
10
11
12
POST /video/v2/goodsList.ios?sysver=11.3 HTTP/1.1
Host: cc.debugly.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Cookie: member_id=sh-upeadqawgz%4056.com; pass_hex=0045c47e0fecd654a387457
Connection: keep-alive
Accept: */*
User-Agent: SohuLiveDemo/6.8.8 (iPhone; iOS 11.1; Scale/3.00)
Content-Length: 114
Accept-Language: en-us
Accept-Encoding: gzip, deflate

ts=1521518926&plat=iPhone&uid=sh-upeadqawgz&signature=3de948ae93767a2382c6a3a4f389ca9b&bundleId=com.sohu.live.demo

针对这个请求拆分为三个部分:

  • 请求行

    1
    
      POST /video/v2/goodsList.ios?sysver=11.3 HTTP/1.1
    

    使用空格分割,分别是:请求方法 请求PATH 协议版本\r\n,注意最后的’\r\n’是必须的。

  • 请求头

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      Host: cc.debugly.com
      Content-Type: application/x-www-form-urlencoded; charset=utf-8
      Cookie: member_id=sh-upeadqawgz%4056.com; pass_hex=0045c47e0fecd654a387457
      Connection: keep-alive
      Accept: */*
      User-Agent: SohuLiveDemo/6.8.8 (iPhone; iOS 11.1; Scale/3.00)
      Content-Length: 114
      Accept-Language: en-us
      Accept-Encoding: gzip, deflate
    

    | 请求头字段名 |字段取值|说明| |:—-:|:—-:|:—-:| |Host| cc.debugly.com|服务器主机地址,可以使用IP:端口号| |Content-Type| application/x-www-form-urlencoded; charset=utf-8|告诉服务器实体消息的编码方式,使用语言| |Cookie| member_id=sh-upeadqawgz%4056.com; pass_hex=0045c47e0fecd654a387457|把 Cookie 带给服务端,通过cookie里的字段可以标识客户端身份| |Connection| keep-alive|指定连接相关的属性| |Accept| */*| 告诉服务器客户端接受的信息类型,比如:text/html| |User-Agent| SohuLiveDemo/6.8.8 (iPhone; iOS 11.1; Scale/3.00)|俗称 UA,用来标识客户端类型| |Content-Length| 114|实体消息内容长度,这个一定要准确无误!| |Accept-Language| en-us|告诉服务器客户端接受的语言| |Accept-Encoding| gzip, deflate|告诉服务器客户端接受的数据压缩格式|

    注意每个值的后面都带有 ‘\r\n’。

  • 请求体

    1
    
      ts=1521518926&plat=iPhone&uid=sh-upeadqawgz&signature=3de948ae93767a2382c6a3a4f389ca9b&bundleId=com.sohu.live.demo
    

    请求体和请求头之间必须使用 ‘\r\n’ 分割,这个例子是个POST请求,带有请求体,针对 GET 请求一般用于检索信息,因此通常是没有请求体的,不过也是要有 ‘\r\n’ 的!

这是一个完整的 Get 请求,比 POST 请求简单,不再分析:

1
2
3
4
5
6
7
8
9
10
```
GET /userinfo?k=2E0Jd HTTP/1.1
Host: cc.debugly.com
Accept: */*
User-Agent: SohuLiveDemo/6.8.8 (iPhone; iOS 11.1; Scale/3.00)
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Connection: keep-alive

```

响应

客户端发起请求之后,服务器要给予响应,响应报文同样的也分为三个部分,分别是:响应行,响应头,响应体。

找了两个响应结构,主要区别在于响应头的信息量:

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
X-Powered-By: Express
content-type: application/json
Date: Thu, 19 Apr 2018 14:16:12 GMT
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive

{"status":200,"ps":{"ts":["1521518926"],"plat":["iPhone"],"uid":["sh-upeadqawgz"],"signature":["3de948ae93767a2382c6a3a4f389ca9b"],"bundleId":["com.sohu.live.demo\r\n"]},"files":{}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
HTTP/1.1 200 OK
Server: GitHub.com
Content-Type: application/json; charset=utf-8
Last-Modified: Thu, 30 Nov 2017 02:54:54 GMT
Access-Control-Allow-Origin: *
Expires: Thu, 19 Apr 2018 14:33:46 GMT
Cache-Control: max-age=600
Content-Encoding: gzip
X-GitHub-Request-Id: 876E:73ED:86D043:904E2B:5AD8A66E
Content-Length: 1014
Accept-Ranges: bytes
Date: Thu, 19 Apr 2018 14:23:58 GMT
Via: 1.1 varnish
Age: 13
X-Served-By: cache-hnd18735-HND
X-Cache: HIT
X-Cache-Hits: 1
X-Timer: S1524147839.820919,VS0,VE0
Vary: Accept-Encoding
X-Fastly-Request-ID: 672fd09797649bf3c76f5bc7407272ef0b2c803d
Proxy-Connection: Keep-alive

{
    "code": "0",
    "content": {
        "gallery": [
                    {
                    "isFlagship": "0",
                    "name": "白色情人节 与浪漫牵手",
                    "pic": "http://pic16.shangpin.com/e/s/15/03/06/20150306174649601525-10-10.jpg",
                    "refContent": "http://m.shangpin.com/meet/189",
                    "type": "5"
                    },
                    {
                    "isFlagship": "0",
                    "name": "【早春新品预售】",
                    "pic": "http://pic11.shangpin.com/e/s/15/03/13/20150313101837452024-10-10.jpg",
                    "refContent": "50310992",
                    "type": "1"
                    }
          ]
      }
}
  • 响应行

    1
    
      HTTP/1.1 200 OK
    

    使用空格分割,分别是:协议版本 状态码 状态码描述\r\n,注意最后的’\r\n’是必须的。状态代码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)

  • 响应头

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
      Server: GitHub.com
      Content-Type: application/json; charset=utf-8
      Last-Modified: Thu, 30 Nov 2017 02:54:54 GMT
      Access-Control-Allow-Origin: *
      Expires: Thu, 19 Apr 2018 14:33:46 GMT
      Cache-Control: max-age=600
      Content-Encoding: gzip
      X-GitHub-Request-Id: 876E:73ED:86D043:904E2B:5AD8A66E
      Content-Length: 1014
      Accept-Ranges: bytes
      Date: Thu, 19 Apr 2018 14:23:58 GMT
      Via: 1.1 varnish
      Age: 13
      X-Served-By: cache-hnd18735-HND
      X-Cache: HIT
      X-Cache-Hits: 1
      X-Timer: S1524147839.820919,VS0,VE0
      Vary: Accept-Encoding
      X-Fastly-Request-ID: 672fd09797649bf3c76f5bc7407272ef0b2c803d
      Proxy-Connection: Keep-alive
    

    | 响应头字段名 |字段取值|说明| |:—-:|:—-:|:—-:| | Server | GitHub.com |服务器主机地址| |Content-Type| application/json; charset=utf-8|告诉客户端实体消息的编码方式,使用语言| |Last-Modified| Thu, 30 Nov 2017 02:54:54 GMT|最后一次修改时间| |Access-Control-Allow-Origin| * |允许所有域名的脚本访问该资源| |Expires| Thu, 19 Apr 2018 14:33:46 GMT|过期时间,客户端做缓存的时候才用到| |Cache-Control| max-age=600|缓存控制| |Content-Encoding| gzip|告诉客户端响应体采用了何种编码格式| |X-GitHub-Request-Id| 876E:73ED:86D043:904E2B:5AD8A66E|Github特有的rid| |Content-Length| 1014|响应体长度| |Accept-Ranges| bytes|可以请求网页实体的一个或者多个子范围字段| |Date| Thu, 19 Apr 2018 14:23:58 GMT|请求发送的日期和时间| |Via| 1.1 varnish|Varnish 加速器的 | |Age| 13|该实体从产生到现在经过多长时间了,服务器端缓存时间| |X-Served-By| cache-hnd18735-HND|服务器信息| |X-Cache| HIT|Squid 加速器的| |X-Cache-Hits| 1|代理服务器相关| |X-Timer| S1524147839.820919,VS0,VE0|代理服务器相关| |Vary| Accept-Encoding|告诉下游代理是使用缓存响应还是从原始服务器请求| |X-Fastly-Request-ID|672fd09797649bf3c76f5bc7407272ef0b2c803d|Fastly CDN 的 HTTP 头| |Proxy-Connection| Keep-alive|代理连接控制|

  • 响应体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
    "code": "0",
    "content": {
        "gallery": [
                    {
                    "isFlagship": "0",
                    "name": "白色情人节 与浪漫牵手",
                    "pic": "http://pic16.shangpin.com/e/s/15/03/06/20150306174649601525-10-10.jpg",
                    "refContent": "http://m.shangpin.com/meet/189",
                    "type": "5"
                    },
                    {
                    "isFlagship": "0",
                    "name": "【早春新品预售】",
                    "pic": "http://pic11.shangpin.com/e/s/15/03/13/20150313101837452024-10-10.jpg",
                    "refContent": "50310992",
                    "type": "1"
                    }
          ]
      }
}