如果HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹。
HTTP使用术语流入和流出来描述事务处理的方向,报文流入源端服务器,工作完之后,会流回客户端。不管是请求报文还是响应报文,所有报文都会向下游流动,所有报文的发送者都在接收者的上游。
1报文的组成部分
所有的报文都可以被分成请求报文或者响应报文。报文由三个部分组成,对报文进行描述的起始行,包含属性的首部,以及可选的包含数据的主题部分。
下面是HTTP请求报文的格式:
<method> <request-URL> <version>
<headers>
<entity-body>
HTTP响应报文的格式:
<version> <status> <reason-phrase>
<headers>
<entity-body>
下面对每个部分分别进行说明。
- 方法
客户端希望服务器对资源执行的操作,是一个单独的词,比如说put,get,delete。 - 请求URL
命名了所请求资源或者URL路径组件的完整URL。 - 版本
报文所使用的HTTP版本,其格式通常为:
HTTP/<major>.<minor> - 状态码
这个三位数字描述了请求过程中所发生的情况。每个状态的第一个数字都描述了状态的一般类型。比如2开头是请求完成,3开头是重定向,4开头是客户端问题,5开头是服务器问题。 - 原因短语
原因短语是配合状态码一起,更详细的描述响应的状态。 - 首部
可以有零个首部或多个首部,每个首部都包含一个名字,后面跟着一个":",然后是一个可选的空格,接着是一个值,最后是一个CRLF。首部是由一个(CRLF)空行结束的,表示首部列表的结束和实体主体部分的开始。 - 实体的主体部分
实体的主体部分包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分。
2方法
1.GET
get是最常用的方法,通常用于请求服务器发送某个资源。
2.HEAD方法和GET方法相似,都是从服务器端拉数据,不同的是使用HEAD方法时响应只返回首部而不返回实体的主题部分。这样既有允许客户端在未获取实际资源的情况下对资源的首部进行检查。使用HEAD可以:
1.在不火气资源的情况下了解资源的情况(如资源类型)
2.通过查看首部测试资源是否被修改了。
3.PUT
与get从服务器中读取文档相反,put会向服务器中写入文档。
PUT方法的语义就是让服务器用请求的主题部分来创建一个由所请求的URL命名的新文档,或者如果那个URL已经存在的话,就用这个主体来替代它。因为普通允许用户进行修改,所以很多web服务器都要求在执行put之前进行验证。
4.POST
5.TRACE
客户端发起一个请求的时候,这个请求可能会穿过防火墙,网关,代理等,每一个中间节点都可能会修改原始的HTTP请求,TRACE允许客户端在报文最终被发送给服务器时查看它最终的样子。
发送TRACE请求时,行程最后一站的服务器会弹回一条TRACE响应,并在响应主体中携带它收到的请求报文,这样发送端就可以检查请求报文是否被修改或毁坏。
6.OPTIONS
OPTIONS方法请求web服务器告知其支持的各种方法。可以询问服务器通常支持哪些方法,,或者对某些特殊资源支持哪些方法。这样客户端不用访问那些资源就能知道访问各种资源的最优方式。
7.DELETE
DELETE方法所做的事情就是请求服务器删除请求URL所指的资源。
3.状态码
HTTP状态码被分为5类,状态码是一个三位数字,以1开头的是信息性状态码,2开头的是请求成功状态码,3开头的是重定向状态码,4开头的是客户端错误状态码,5开头的是服务器错误状态码。下面分别进行说明。
1. 100-199状态码
状态码 | 原因短语 | 含义 |
---|---|---|
100 | Continue | 服务器已经接受到请求头并且客户端应该继续发送请求主体 |
101 | Switching Protocols | 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求 |
2. 200-299 ——成功状态码
这一类型的状态码,代表请求已经被服务器成功接收,理解。
状态码 | 原因短语 | 含义 |
---|---|---|
200 | OK | 请求没问题,实体的主体部分包含了所请求的资源 |
201 | Created | 请求已经被实现,而且已经有一个新的资源依请求需要而创建,且其URL已经随响应的location头部信息返回,假如需要的资源没法创建,则返回202 |
202 | Accepted | 请求已经被接受,但是服务器还没有执行任何操作,不能保证服务器会完成这个请求 |
204 | No Content | 服务器成功处理了请求,但是没有返回任何内容 |
205 | Reset Content | 服务器成功处理了请求,但是没有返回任何内容,和204不同,此响应要求请求者重置响应视图 |
206 | Partial Content | 客户端可以通过某些特殊的首部来获取部分或某个范围内的文档,这个状态码就说明范围请求成功了。 |
3. 300-399 ——重定向状态码
重定向状态码要么告诉客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容。如果资源已被移动,可发送一个重定向状态码和一个可选的location首部来告知客户端资源已被移走,以及现在可以再哪里找到它。
状态码 | 原因短语 | 含义 |
---|---|---|
300 | Multiple Choices | URL对应的资源有多重选择,比如HTML网页有中文的和英文的 |
301 | Moved Permanently | 资源被永久移除了,一般在响应的location首部中给出重定向的URL |
302 | Found | 资源只是临时重定向,以后请求还是使用旧的URL,在响应头中应该给出location首部来定位临时资源 |
304 | Not Modified | 表示资源未被修改,因为请求头指定了If-Modified-Since或If-None-Match,这样客户端仍然使用以前的副本 |
4. 400-400 ——客户端错误状态码
有时候客户端会发送一些服务器无法处理的东西,比如格式错误的请求报文,或者请求一个不存在的URL。很多客户端错误都是由浏览器来处理的,并不会打扰到用户,只有少数比如404会穿过浏览器来到用户面前。
状态码 | 原因短语 | 含义 |
---|---|---|
400 | Bad Request | 用于告知客户端它发送了一个错误的请求 |
401 | Unauthorized | 比如有时候请求的会后需要加上token认证,这时候没有加token就会出现401 |
403 | Forbidden | 被服务器拒绝,服务器可以在实体的主题部分对原因进行描述,但是这个状态码通常是在服务器不想告知拒绝理由的时候使用 |
404 | Not Found | 服务器无法找到所请求的URL |
405 | Method Not Allowed | 发起的请求中带有所请求的URL不支持的方法。应该在响应中包含allow首部,告知客户端可以对所请求的URL使用的方法。 |
406 | Not Acceptable | 客户端可以在请求头中指定它们原意接受什么类型的实体,当服务器无法给出特定类型的资源时使用此状态码。 |
408 | Request Timeout | 客户端没有在服务器预备等待的时间内完成请求 |
411 | Length Required | 服务器要求在请求报文中包含Content-length时使用 |
5. 500-599 ——服务器错误状态码
有时候客户端发送了一条有效请求,服务器自身却出错了。代理尝试着代表客户端与服务器进行交流时经常会出现问题。
状态码 | 原因短语 | 含义 |
---|---|---|
500 | Internal Server Error | 服务器遇到妨碍它为客户端提供请求的错误时 |
501 | Not Implemented | 客户端发出的请求超出了服务器的能力范围时,使用此状态码 |
502 | Bad Gateway | 作为代理或网关使用的服务器从上游服务器接收到无效的响应 |
503 | Service Unavailable | 临时的服务器维护或过载 |
4.首部
首部可以分为通用首部,请求首部,响应首部,实体首部。下面分别对这几部分进行说明:
1.通用首部
这些是在客户端和服务器都可以使用的首部,可以在客户端,服务器和其他应用之间提供一些非常有用的通用功能。
下表是一些通用的信息性首部:
首部 | 描述 |
---|---|
Date | 提供日期和时间标志,说明报文是什么时候创建的 |
MIME-Version | 给出了发送端使用MIME版本 |
Transfer-Encoding | 告诉接收端为了保证报文的可靠传输,对报文采用了什么编码方式 |
Via | 显示了报恩经过的中间节点 |
通用缓存首部:
首部 | 描述 |
---|---|
Cache-Control | 用于传输对象的缓存信息,它的值是一个缓存指令,给出了对某个对象可缓存性有关的特有指令 |
Pragma | 另一种随报文传送指示的方式,但并不专用于缓存 |
2.请求首部
请求首部是只在请求报文中有意义的首部,用于说明是谁或什么在发送请求,请求源于何处,或者客户端的喜好或能力。
1.请求的信息性首部
首部 | 描述 |
---|---|
Client-IP | 运行客户端的机器的IP地址 |
Host | 接收请求的服务器的主机名和端口号 |
Referer | 如果在主页A上点击一个链接,进入主页,浏览器就会在请求头中加入一个带有值AdeReferer首部,只有在点击链接的时候,浏览器才会加入这个首部,自己输入链接时不会插入这个首部 |
2.Accept首部
首部 | 描述 |
---|---|
Accept | 告诉服务器,客户端能够接受哪些媒体类型 |
Accept-Charset | 告诉服务器能够发送哪些字符集 |
Accept-Encoding | 告诉服务器能够发送哪些编码方式 |
Accept-Language | 告诉服务器能够发送哪些语言 |
3.条件请求首部
首部 | 描述 |
---|---|
If-Match | 如果实体标记与文档当前的实体标记相符,就获取这份文档 |
If-Modified-Since | 如果文档在这个指定的日期之后进行了修改,就获取这份文档 |
If-None-Match | 如果实体标记与文档当前的实体标记不符,就获取文档 |
If-Range | 允许对文档的某个范围进行条件请求 |
If-Unmodified-Since | 如果在这个指定的日期之后没有被修改过,那么久获取这个文档 |
4.安全请求首部
首部 | 描述 |
---|---|
Authorization | 用来向服务器回应自己的身份验证信息 |
Cookie | 客户端识别和跟踪的扩展首部 |
3.响应首部
响应报文都有自己的响应首部集,响应首部为客户端提供了一些额外的信息,比如谁在发送响应,响应者的功能,甚至和响应相关的一些特殊指令。这些首部有助于客户端处理响应,并在将来发起更好的请求。
1.响应的信息性首部
首部 | 描述 |
---|---|
Age | 响应持续时间 |
Server | 服务器应用程序软件的名称和版本 |
Title | 对HTML文档来说,就是HTML源端给出的标题 |
2.安全响应首部
|首部|描述|
|Proxy-Authenticate|来自代理的队客户端的质询列表|
|Set-Cookie|不是真正的安全首部,但是隐含有安全功能,可以再客户端设置一个令牌,以便服务器对客户端进行标识|
4.实体首部
有很多首部可以用来描述HTTP报文的负荷,由于请求和响应报文中都可能包含实体部分,所以在这两种类型的报文中都可能出现这些首部。
首部 | 描述 |
---|---|
Allow | 可以对此实体执行的请求方法 |
Location | 告知客户端实体实际上位于何处,大部分时候用于重定向 |
Content-Type | 主体的对象类型 |
Content-Length | 主体的长度或尺寸 |
Content-Location | 资源实际所处的位置 |
ETag | 与此实体相关的实体标记 |
Expires | 实体不再有效,要从原始的源端再次获取此实体的日期和时间 |
Last-Modified | 这个实体最后一次修改的日期和时间 |