1、说明
我写这个文章主要是为了记录HTTP中报文的格式,以便针对报文进行解析。最主要是介绍基础的HTTP报文。先来个图总结一下:
2、HTTP基础报文格式
按照HTTP报文类型进行介绍,HTTP报文类型分为请求报文(客户端主动请求报文)和响应报文(服务端响应客户端的回传报文)。其基本的格式为:
请求报文是由请求方法、 请求 URI、协议版本、可选的请求首部字段和内容实体构成的。详情如图所示:
请求示例:
原始请求头
GET /system/cms/content?time=1584092466766 HTTP/2
Host: login.baidu.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: https://login.baidu.com/system
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: UM_distinctid=16f36034a523a1-0241e6bdab4e0e-7711b3e-1fa400-16f36034a5348a; Hm_lvt_997d76898813924d5ca3f13c90b6a7c9=1577159183; Hm_lvt_c7d79861fc114d97bd915a8f73ec2168=1577159183; Qs_lvt_285746=1577159183; Qs_pv_285746=1802346816205328000; LiveWSAWT33913715=5895797b8c124061a4f799bf85e37843; NAWT33913715fistvisitetime=1577159183249; NAWT33913715lastvisitetime=1577159183249; NAWT33913715visitecounts=1; NAWT33913715visitepages=1; NAWT33913715IP=%7C123.52.43.135%7C; bjui_theme=blue; SESSION=ZWIzNGFkNGMtNjk4Mi00ZDI5LTlkMWQtZTkwN2ZkNjM5MGM5
解析后的请求头
Accept: text/html, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: no-cache
Connection: keep-alive
Cookie: UM_distinctid=16f36034a523a1-0241e6bdab4e0e-7711b3e-1fa400-16f36034a5348a; Hm_lvt_997d76898813924d5ca3f13c90b6a7c9=1577159183; Hm_lvt_c7d79861fc114d97bd915a8f73ec2168=1577159183; Qs_lvt_285746=1577159183; Qs_pv_285746=1802346816205328000; LiveWSAWT33913715=5895797b8c124061a4f799bf85e37843; NAWT33913715fistvisitetime=1577159183249; NAWT33913715lastvisitetime=1577159183249; NAWT33913715visitecounts=1; NAWT33913715visitepages=1; NAWT33913715IP=%7C123.52.43.135%7C; bjui_theme=blue; SESSION=ZWIzNGFkNGMtNjk4Mi00ZDI5LTlkMWQtZTkwN2ZkNjM5MGM5
Host: devlogin.baidu.com
Pragma: no-cache
Referer: https://login.baidu.com/system
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36
X-Requested-With: XMLHttpRequest
2.1 请求报文
请求报文数据格式由三个部分组成:请求方法、URI、HTTP协议版本
2.1.1 请求行
该部分位于数据首行,基本格式为:
GET /system/cms/content?time=1584092466766 HTTP/1.1(请求方法、URI、HTTP协议版本)
该部分给出了请求类型和请求的资源位置(/index.html),其中HTTP中的请求类型包括:GET、POST、PUT、HEAD、PATCH、DELETE等等,一般常用的为POST和GET方式。
2.1.2 请求头部
该部分紧跟着上一部分(方法、协议版本行),该部分主要是用于描述请求正文,其基本格式如下:
Host: devlogin.baidu.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: https://devlogin.baidu.com/system
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: UM_distinctid=16f36034a523a1-0241e6bdab4e0e-7711b3e-1fa400-16f36034a5348a;
主要是用于说明请求源、连接类型、以及一些Cookie信息等。
2.1.3 请求空行
接着以一空行分隔,下面紧挨着的是请求正文
2.1.4 请求正文
请求正文和请求头部通过一个空行进行隔开,一般用于存放POST请求类型的请求正文,如上的请求体为:
time=1584092467212
2.2 响应报文
先上图看一下大致有什么内容,再详情介绍
响应报文和请求报文格式类型相似,同样也是分为三个部分,响应头部和响应体同样也是通过一个空行进行隔开,如下为一个简单的示例:
原始响应头
HTTP/2 200 OK
date: Fri, 13 Mar 2020 09:53:06 GMT
content-type: text/plain
server: nginx
vary: Accept-Encoding
access-control-allow-origin: *
access-control-allow-headers: accept, content-type, classname
access-control-allow-methods: POST, GET, OPTIONS
content-encoding: gzip
X-Firefox-Spdy: h2
解析后的响应头
access-control-allow-headers:accept, content-type, classname
access-control-allow-methods:POST, GET, OPTIONS
access-control-allow-origin :*
content-encoding:gzip
content-type:text/plain
date:Fri, 13 Mar 2020 09:53:06 GMT
server:nginx
vary:Accept-Encoding
X-Firefox-Spdy:h2
2.2.1 响应行
该部分主要给出响应HTTP协议版本号、响应返回状态码、响应描述,同样是单行显示。格式为:
HTTP/2 200 OK
状态码部分:响应返回一般由一个三位数组成,分别以整数1~5开头组成。各个类型响应对应含义:
常见的响应有:200(响应成功),400(请求异常,一般为参数异常),404(请求资源不存在),405(请求方式不支持),500(服务器内部异常)。
2.2.2 响应头部
响应头部主要是返回一些服务器的基本信息,以及一些Cookie值等。如上的响应头为:
date: Fri, 13 Mar 2020 09:53:06 GMT
content-type: text/plain
server: nginx
vary: Accept-Encoding
access-control-allow-origin: *
access-control-allow-headers: accept, content-type, classname
access-control-allow-methods: POST, GET, OPTIONS
content-encoding: gzip
X-Firefox-Spdy: h2
2.2.3 响应空行
接着以一空行分隔, 之后的内容称为资源实体的主体( entity body)。
2.2.4 响应正文(响应实体)
该部分为请求需要得到的具体数据,可以为任何类型数据,一般网页浏览返回的为html文件内容。内容不再列出,同样和响应头部通过一个空行进行隔开。
3、图解HTTP部分原文
以下图片截于名叫《图解HTTP》的一本书籍第三章节中:
【参考资料】
1、HTTP 协议报文解析:https://blog.csdn.net/chf1142152101/article/details/74162755
2、一文带你看清 HTTP 所有概念:https://blog.csdn.net/qq_36894974/article/details/104044932
3、图解HTTP书籍--【日】上野宣 著,于均良 译。