HTTP请求报文和响应报文

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

1. HTTP报文

HTTP报文是由一行一行的简单字符串组成的。HTTP报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写。下图是一个例子:

image

从Web客户端发往Web服务器的HTTP报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的HTTP报文。HTTP请求和响应报文的格式很类似。

HTTP 报文包括以下三个部分:

  • 起始行
    报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。

  • 首部字段
    起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。

  • 主体
    空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括 了要发送给 Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意 的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含 文本。

2. HTTP请求报文

1
2
3
4
5
6
7
8
9
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=4082549DEE5E64678FC46642E185D98C:FG=1; BIDUPSID=4082549DEE5E64678FC46642E185D98C; PSTM=1472215668; MCITY=-%3A; BDSFRCVID=pSFsJeCCxG3C4A5iySIze8tzxQmzvLxREDct3J; H_BDCLCKID_SF=tR38LRu8KJjEe-Kk-PnVeUFLQlbZKxJmMgkeWlbMQnTR85CGXUQVWx4_Qb6gXU-L5nT9bDOFfDL2bKKmjTL3K4LOMq5-5b0X-K5L3JD8bnjoHRjvq4bohjPy5G7eBtQm05bxohOIHRoE8M0m2ROkMtutKJjQW-nQ5HbbhCLbWDF5MIDGj50WenLHMfnXetJQ2C7WsJceHJOoDDvx0Uj5y4LdLp7xJMtJ0RT0XxOYMJKWf-c90tc05xAb04oR5b0eWJQ2QJ8BtCtKhD3P; pgv_pvi=7232093184; pgv_si=s9982430208; BDRCVFR[IzI_eUGSZP3]=mbxnW11j9Dfmh7GuZR8mvqV; BD_CK_SAM=1; PSINO=5; BD_HOME=0; H_PS_PSSID=1421_17946_21125_18559_21455_21419_21394_21378_21191_21398; BD_UPN=123253; BD_LAST_QID=17716714193052416912

解释:

  • GET / HTTP/1.1,请求起始行

  • GET,请求方法

  • /,请求URL,命名了所请求资源,或者URL路径组件的完整URL。如果直接与服务器进行对话,只要URL的路径组件是资源的绝对路径,通常就不会有什么问题——服务器可以假定自己是URL的主机/端口。

  • HTTP/1.1,请求采用的协议及版本号

  • Host,请求的服务器

  • Connection,连接方式

  • Upgrade-Insecure-Requests,

  • User-Agent,将发起请求的应用程序名称告知服务器

  • Accept,请求首部,是请求报文特有的。它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据。例子中接收html,xhtml,xml等数据。

  • Accept-Encoding,告诉服务器能够发送哪些编码方式

  • Accept-Language,告诉服务器能够发送哪些语言

  • Cookie,Cookie信息,客户端用它向服务器传送一个令牌——它并不是真正的安全首部,但确实隐含了安全功能

3. HTTP响应报文

1
2
3
4
5
6
7
8
9
10
11
12
$ curl -I www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 03 Nov 2016 08:30:43 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:03 GMT
Connection: Keep-Alive
ETag: "575e1f5b-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes

解释:

  • HTTP/1.1 200 OK,响应状态行

  • HTTP/1.1,访问采用的协议为HTTP,版本为1.1

  • 200,HTTP状态码,表示文档正确返回

  • OK,一个描述性的原因短语

  • Server,服务器应用程序软件的名称和版本

  • Date,服务器产生响应的日期

  • Content-Type,实体中所承载对象的类型,例子中响应实体的主体是一个html文本。

  • Content-Length,所传送实体主体的长度或大小,例子中响应实体的主体包含了277字节的数据

  • Last-Modified,资源的最后修改日期时间

  • Connection,连接方式,close或keep-alive

  • ETag,资源的匹配信息

  • Cache-Control,控制缓存的行为

  • Pragma,报文指令

  • Accept-Ranges,是否接受字节范围请求

如果有收获,可以请我喝杯咖啡!