文章

HTTP/1.1 协议简介

HTTP/1.1 协议简介

简介

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
请求头字段名字段取值说明
Hostcc.debugly.com服务器主机地址,可以使用IP:端口号
Content-Typeapplication/x-www-form-urlencoded; charset=utf-8告诉服务器实体消息的编码方式,使用语言
Cookiemember_id=sh-upeadqawgz%4056.com; pass_hex=0045c47e0fecd654a387457把 Cookie 带给服务端,通过cookie里的字段可以标识客户端身份
Connectionkeep-alive指定连接相关的属性
Accept*/*告诉服务器客户端接受的信息类型,比如:text/html
User-AgentSohuLiveDemo/6.8.8 (iPhone; iOS 11.1; Scale/3.00)俗称 UA,用来标识客户端类型
Content-Length114实体消息内容长度,这个一定要准确无误!
Accept-Languageen-us告诉服务器客户端接受的语言
Accept-Encodinggzip, 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
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
响应头字段名字段取值说明
ServerGitHub.com服务器主机地址
Content-Typeapplication/json; charset=utf-8告诉客户端实体消息的编码方式,使用语言
Last-ModifiedThu, 30 Nov 2017 02:54:54 GMT最后一次修改时间
Access-Control-Allow-Origin*允许所有域名的脚本访问该资源
ExpiresThu, 19 Apr 2018 14:33:46 GMT过期时间,客户端做缓存的时候才用到
Cache-Controlmax-age=600缓存控制
Content-Encodinggzip告诉客户端响应体采用了何种编码格式
X-GitHub-Request-Id876E:73ED:86D043:904E2B:5AD8A66EGithub特有的rid
Content-Length1014响应体长度
Accept-Rangesbytes可以请求网页实体的一个或者多个子范围字段
DateThu, 19 Apr 2018 14:23:58 GMT请求发送的日期和时间
Via1.1 varnishVarnish 加速器的
Age13该实体从产生到现在经过多长时间了,服务器端缓存时间
X-Served-Bycache-hnd18735-HND服务器信息
X-CacheHITSquid 加速器的
X-Cache-Hits1代理服务器相关
X-TimerS1524147839.820919,VS0,VE0代理服务器相关
VaryAccept-Encoding告诉下游代理是使用缓存响应还是从原始服务器请求
X-Fastly-Request-ID672fd09797649bf3c76f5bc7407272ef0b2c803dFastly CDN 的 HTTP 头
Proxy-ConnectionKeep-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"
                    }
          ]
      }
}
本文由作者按照 CC BY 4.0 进行授权