Matt Reach

HTTP/1.1 协议简介

HTTP

2018-04-09

简介

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
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"
}
]
}
}
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章