简介
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"
}
]
}
}