HTTP请求报文
实例:
GET /index.html HTTP/1.1
Host: www.enjoytoday.cn
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.enjoytoday.cn/posts/326
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: bdshare_firstime=1466032270994;
username=hfcai&sex=man
接下来,根据实例分析http请求报文的结构
结构
一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分构成:
1.请求行
请求行数据格式由三个部分组成:请求方法(如GET)、URI(如/index.html)、HTTP协议版本(如HTTP/1.1),他们之间用空格分隔
a:请求方法
包括:GET、POST、HEAD、PUT、DELETE。一般常用的为GET和POST方式
b:URI
请求的资源位置
c:HTTP协议版本
HTTP1.0: 每个连接都只能传送一个请求和响应,请求完服务器返回响应就会关闭,HTTP1.0没有Host字段
HTTP1.1: 在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段
HTTP2.0: 一次请求多次响应,合并多次请求的头信息
2.请求头部
请求头部紧跟着请求行,该部分主要是用于描述请求正文
a: 通用报头
既可以出现在请求报头,也可以出现在响应报头中
Date:表示消息产生的日期和时间
Connection:允许发送指定连接的选项,指定连接是keep-alive或者close,通知服务器,在响应完成后,是否关闭连接
Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)
b: 请求报头
请求报头通知服务器关于客户端请求的信息,典型的请求头有:
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
User-Agent:发送请求的浏览器类型、操作系统等信息
Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
Accept-Encoding:客户端可识别的数据编码
Accept-Language:表示浏览器所支持的语言类型
Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
c: 实体报头
实体报头用来定于被传送资源的信息,既可以用于请求也可用于响应。请求和响应消息都可以传送一个实体,常见的实体报头为:
Content-Type:发送给接收者的实体正文的媒体类型
Content-Lenght:实体正文的长度
Content-Language:描述资源所用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读
Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制
Last-Modified:实体报头用于指示资源的最后修改日期和时间
Expires:实体报头给出响应过期的日期和时间
3.空行
请求数据和请求头部通过一个空行进行隔开
4.请求数据(消息主体)
一般用于存放POST请求类型的请求正文。通过实体报头规定消息主体的格式内容
常见的格式:
a: Content-Type=text/plain
纯文本格式
b: Content-Type=application/x-www-form-urlencoded
定义为Key=value格式
c: Content-Type=application/json
定义为序列化为的json字符串
d: Content-Type= multipart/form-data
(1) 该格式是post的常见提交方式,也就是说是由post方法来组合实现的
(2) 使用该提交方法需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。具体的头信息如下:
Content-Type: multipart/form-data; boundary=xxx
其中xxx是自定义的分隔符,一般情况用一长串不会和业务数据重复的字符串表示 ,例如9431149156168
(3) 分割符前面需要加上--
(4) 最后的分割符后面也需要加上—
(5) 所有的数据请求头和数据之间都用\r\n分开,两个数据间用 --xxx\r\n分开
Content-Type: multipart/form-data; boundary=9431149156168
Content-Length: 123456
--9431149156168
Content-Disposition: form-data; name="key"<br>
acl
--9431149156168
Content-Disposition: form-data; name="success_action_redirect"<br>
success_redirect
--9431149156168
Content-Disposition: form-data; name="content-Type"<br>
text/plain
--9431149156168
Content-Disposition: form-data; name="x-amz-meta-uuid"<br>
uuid
--9431149156168
Content-Disposition: form-data; name="x-amz-meta-tag"<br>
metadata
--9431149156168--
HTTP响应报文
实例:
HTTP/1.1 200 OK
Date: Sat, 01 Jul 2017 14:51:26 GMT
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: JSESSIONID=84C993F5E433C4DE9BFBA57150FFC065.ajp13_worker;path=/;HttpOnly
Content-Language: zh-CN
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 7333
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html;charset=UTF-8
<html>
<head>
<title>title of html.</html>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>
接下来,根据实例分析http响应报文的结构
结构
HTTP响应报文由状态行、响应头部、空行和响应体4个部分构成
1.状态行
状态行主要包括响应HTTP协议的版本号、响应返回状态码、响应描述
2.响应头部
响应头部主要是返回一些服务器的基本信息,以及一些Cookie值等。用于服务器传递自身信息的响应,常见的响应报头:
Location:用于重定向接受者到一个新的位置,常用在更换域名的时候
Server:包含可服务器用来处理请求的系统信息,与User-Agent请求报头是相对应的
3.空行
请求数据和请求头部通过一个空行进行隔开
4.响应体
响应体为请求需要得到的具体数据,可以为任何类型数据,一般网页浏览返回的为html文件内容