如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了。
1、报文流:HTTP报文是个数据块,用于HTTP应用程序之间发送。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动。
1)报文流入源端服务器:报文流入源端服务器,工作完成后,会流回用户的Agent代理中。
2)报文向下游流动:HTTP报文会像河水一样流动。所有报文都会向下游流动,所有报文的发送者都在接收者的上游。
2、报文的组成部分:对报文进行描述的起始行、包含属性的首部块、以及可选的、包含数据的主体部分。如下图所示,为http报文的格式:
1)报文的语法:请求报文和响应报文。请求报文会向web服务器请求一个动作。响应报文会将请求的结果返回给客户端。下图所示的是请求和响应报文示例:
2)起始行:所有的HTTP报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么。响应报文的起始行说明发生了什么。
.请求行:包含了一个方法和一个请求URL,HTTP版本。描述了服务器要对哪个资源执行什么样的操作。所有字段都由空格分隔。
.响应行:承载了状态信息和操作产生的所有结果数据,将其返回给客户端。包含了响应报文使用的HTTP版本、数字状态码,以及描述操作状态的文本形式的原因短语。
3)方法:HTTP规范中定义了一组常用的请求方法。比如,GET方法负责从服务器获取一个文档,POST方法会向服务器发送需要处理的数据,OPTIONS方法用于确定Web服务器的一般功能,或者Web服务器处理特定资源的能力。常用的HTTP方法如下:
GET:从服务器获取一份文档;
HEAD:只从服务器获取文档的首部;
POST:向服务器发送需要处理的数据;
PUT:将请求的主体部分存储在服务器上;
TRACE:对可能经过代理服务器传送到服务器上去的报文进行追踪;
OPTIONS:决定可以在服务器上执行哪些方法;
DELETE:从服务器上删除一份文档
4)状态码:方法是告诉服务器做什么事情的,状态码则用来告诉客户端,发生了什么事情。最常见的状态码:
200:OK 成功,请求的所有数据都在响应主体中
401:未授权,需要输入用户名和密码
404:未找到,服务器无法找到所请求URL对应的资源。
5)原因短语:200 OK中的OK就是原因短语。
6)版本号:说明了应用程序支持的最高HTTP版本。注意,版本号不会当做小数处理。HTTP/2.22比HTTP/2.3的版本要高。
7)首部:
首部实例:
8)主体:HTTP要传输的内容。
3、方法:
1)安全方法:GET方法和HEAD方法的HTTP请求都不会产生什么动作,也就是说不会在服务器上产生什么结果。
GET:用于请求服务器发送某个资源。
HEAD:在服务器响应中只返回首部,不会返回实体的主体部分。这就允许客户端在未获取资源的情况下,对资源的首部进行检查。使用HEAD,可以:
.在不获取资源的情况下了解资源的情况;
.通过查看响应中的状态码,看看某个对象是否存在;
.通过查看首部,测试资源是否被修改了。
PUT:与GET相反,向服务器写入文档。因为PUT允许用户对内容进行修改,所以很多Web服务器都要求在执行PUT之前,用密码登录。
POST:通常用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到它要去的地方。
TRACE:客户端发起一个请求的时候,这个请求可能要穿过防火墙、代理、网关或者其他一些应用程序。每个中间节点都可能会修改原始的HTTP请求。TRACE方法允许客户端在最终请求发送给服务器时,看看它变成了什么样子。原始报文是否,以及如何被毁坏或者修改过。TRACE方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链。也可以用来查看代理和其他应用程序对用户请求所产生效果。
OPTIONS:请求Web服务器告知其支持的各种功能。
DELETE:请服务器删除请求URL所指定的资源。但是,客户端应用程序无法保证删除操作一定会被执行。因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。
2)扩展方法:指的是没有在HTTP/1.1中定义的方法。
LOCK:允许用户锁定资源
MKCOL:允许用户创建资源
COPY:便于在服务器上复制资源
MOVE:在服务器上移动资源
4、状态码:
100~199:信息状态码。
200~299:成功状态码。
300~399:重定向状态码:要么告诉客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容。如果资源已经被移动,可发送一个重定向状态码和一个可选的Location首部来告知客户端资源已经被移走,以及现在可以在哪里找到他。
在报文的首部中添加“If-Modified-Since”首部,可以查询是否被修改过,如果文件没有被修改过,那么将返回304。
400~499:客户端错误状态码:有时候客户端会发送一些服务器无法处理的东西,比如格式错误的请求报文,或者最常见的是请求一个不存在的URL。
400:告知客户端它发送了一个错误的请求。
403:请求被服务器拒了。
404:未找到URL。
405:发起的请求中带有所请求的URL不支持的方法。
500~599:服务器错误状态码:代理尝试着代表客户端与服务器进行交流时,经常会出现问题。代理会发布5xx服务器错误状态码来描述所遇到的问题。
500:服务器遇到一个妨碍它为请求提供服务的错误时,使用此码。
501:客户端发起的请求超出服务器的请求范围(使用了服务器不支持的请求方法)。
5、首部:首部与方法共同工作,决定了客户端和服务器能做什么事情。
1)通用首部:在客户端和服务器段通用的首部,提供了与报文相关的最基本的信息。例如,Date首部,构建报文的时间和日期。
2)请求首部:只在请求报文中有意义的首部。用于说明是谁在发送请求,请求源自何处,或者客户端的喜好及能力。
.Accept首部:为服务器提供了一些额外的信息,比如客户端希望接收什么类型的数据。例如,下面的Accept首部就用来告知服务器客户端会接受与其请求相符的任意媒体类型:Accept:*/*
Accept:告诉服务器能够发送哪些媒体类型。
Accept-Charset:告诉服务器能够发送哪些字符集。
Accept-Encoding:告诉服务器发送哪些编码方式。
.条件请求首部:比如,客户端有了一份文档副本,就希望只在服务器上的文档与客户端拥有的副本有所区别时,才请求服务器传输文档。那么客户端可以为请求加上这种限制。
Expect:允许客户端列出某请求所要求的服务器行为。
If-Match:如果实体标记与文档当前的实体标记相匹配,就获取这份文档。
If-Modified-Since:除非在某个指定的日期之后修改过,否则就限制这个请求。
.代理请求首部:
Max-Forward:在通往源端服务器的路径上,将请求转发给其他代理或网关的最大次数。
proxy-Authotization:在与代理进行认证时使用的。
3)响应首部:响应报文有自己的首部集,以便为客户端提供信息(比如,客户端在与那种类型的服务器进行交互)。例如,下列server首部就用来告知客户端它在一个版本1.0的Tiki-Hut服务器进行交互:
server:Tiki-Hut/1.0
4)实体首部:用于应对实体主体部分的首部。
.首部内容,提供了与实体内容有关的特定信息,说明了其类型、尺寸以及处理它所需要的其他有用信息。比如,可以用实体首部来说明实体主体部分的数据类型。例如:Content-Type:text/html;charset=iso-latin-1
Content-Encoding:对主体执行的任意编码方式。
Content-Location:资源实际所处的位置。
Content-MD5:主体的MD5校验和。