本文是《HTTP权威指南》的读书笔记
HTTP报文是简单的格式化数据块。每条报文都包含一条来自客户端的请求或一条来自服务器的响应。它们由三部分组成:
- 对报文进行描述的起始行(start line);
- 包含属性的首部块(head);
- 可选的,包含数据的主体(body)部分;
请求报文的格式与响应报文的格式稍有不同:
<method><request-URL><version>
<headers>
<entity-body>
<version><status><reason-phrase>
<headers>
<entity-body>
报文各部分的简要描述:
-
method
,客户端希望服务器对资源执行的动作,如GET,HEAD,POST等;
-
requset-URL
,命名所请求的资源;
-
version
,报文所使用的HTTP的版本;
-
status
,状态码,用三位数字描述请求过程中所发生的情况,如200,表示请求成功;
-
reasuon-phrase
,前面状态码的可读短语;
-
headers
,首部,可以有零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF;
-
entity-body
,主体部分,包含一个由任意数据组成的数据块;
常用的HTTP方法:
方法 |
描述 |
是否包含主体 |
GET |
从服务器获取信息 |
否 |
HEAD |
只从服务器获取信息的首部 |
否 |
POST |
向服务器发送需要处理的数据 |
是 |
TRACE |
对可能经过代理服务器传到服务器上去的报文进行追踪 |
否 |
PUT |
将请求的主体存储在服务器上 |
是 |
OPTIONS |
决定可以在服务器上执行哪些方法 |
否 |
DELETE |
从服务器上删除一份文档 |
否 |
HTTP定义了一组称为安全方法的方法:GET和HEAD,因为这两个方法都不会在服务器上产生什么结果(不会对服务器上的资源进行更改,删除等);TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成什么样子了(发起一个请求时,这个请求可能会经过一系列的中间节点,如代理,防火墙等,每个中间节点都可能会修改原始的HTTP请求;)
状态码用来描述请求过程发生的情况,状态码的分类:
整体范围 |
已定义范围 |
分类 |
100~199 |
100~101 |
信息提示 |
200~299 |
200~206 |
成功 |
300~399 |
300~305 |
重定向 |
400~499 |
400~415 |
客户端错误 |
500~599 |
500~505 |
服务器错误 |
最常见的状态码:
状态码 |
原因短语 |
含义 |
200 |
OK |
成功,请求的所有数据都在响应主体中 |
401 |
Unauthorized(未授权) |
需要输入用户名和密码 |
404 |
Not Found(没有找到) |
服务器无法找到请求URL所对应的资源 |
状态码的详细信息:
1. 100~199信息状态码
状态码 |
原因短语 |
含义 |
100 |
Continue |
收到请求的初始部分,请客户端继续 |
101 |
Switching Protocols |
服务器将根据客户端的指定,将协议切换为Update首部所列的协议 |
对于100状态码的使用,如果客户端想向服务器发送一个实体,但不知道服务器是否可以接受,则可以发送带有100状态码的请求,服务器收到这个状态杩的请求后,根据自己的情况,对这个请求进行响应;
2. 200~299 成功状态码
状态码 |
原因短语 |
含义 |
200 |
OK |
请求成功,所有数据都在响应主体中 |
201 |
Created |
用于创建服务器对象的请求,服务器必须在发送这个状态码之前创建好对象 |
202 |
Accepted |
请求已接受,但服务器还未对其执行任何动作 |
203 |
Non-Authoriative |
实体首部所包含信息不是来自源端服务器,是资源的一个副本 |
204 |
No Content |
响应报文中没有主体的实体部分,只有首部与状态行; |
205 |
Reset Content |
让浏览器清除当前页面的所有HTML表单元素 |
206 |
Parial Content |
成功执行了一个部分请求 |
3. 300~399 重定向状态码
状态码 |
原因短语 |
含义 |
300 |
Multiple Choice |
客户端请求一个实际指向多个资源的URL时返回这个状态码,让用户进行选择 |
301 |
Moved Permanently |
在请求的URL已被移除时使用,响应的首部会包含资源现在所处的URL |
302 |
Found |
与301类似,使用首部给出的URL来临时定位资源,但将来的请求仍使用老的URL |
304 |
Not Modified |
带这个状态码的响应不会包含实体的主体部分 |
305 |
Used Proxy |
说明必须通过代理来访问资源,代理位置由Location首部给出 |
307 |
Temporaty Redirect |
与302类似 |
4.400-499 客户端错误状态码
状态码 |
原因短语 |
含义 |
400 |
Bad Request |
发送了一个错误的请求 |
401 |
Unauthorized |
在得到资源前,需要对客户端的身份进行验证 |
402 |
Payment Required |
保留,还未使用 |
403 |
Forbidden |
请求被拒绝 |
404 |
Not Found |
请求的资源没有找到 |
405 |
Method Not Allowed |
使用不被允许的方法对资源进行访问,响应的Allows首部会包含可以使用的方法 |
406 |
Not Acceptable |
客户端指定参数说明它们可以接收什么类型的实体,服务器没有客户端所希望的类型的资源时,返回该状态码 |
407 |
Proxy Authentication Required |
与401类似,用于要求对资源认证的代理服务器 |
408 |
Request Timeout |
请求超时 |
409 |
Conflict |
请求可能会在资源上引发冲突,响应中会包含描述冲突的主体 |
410 |
Gone |
与404类似,但服务器曾经存在该资源 |
411 |
Length Required |
服务器要求请求报文中包含Content-Length首部时使用 |
412 |
Proconditin Failed |
客户端发起条件请求,但其中一个条件失败了 |
413 |
Request Entity Too Large |
客户端发送的实体比服务器希望处理的要大 |
414 |
Request URI Too Long |
请求URI过长 |
415 |
Unsupported Media Type |
服务器无法支持客户端所发实体的内容类型 |
416 |
Request Range Not Satisfiable |
请求的范围无效或无法满足 |
417 |
Expectation Failed |
服务器无法满足请求报文中Except首部中的期望 |
5.500~599 服务器错误状态码
状态码 |
原因短语 |
含义 |
500 |
Internal Server Error |
服务器遇到一个妨碍它为请求提供服务的错错误 |
501 |
Not Implemented |
请求超出服务器的能力范围(如,使用了服务器不支持的请求方法) |
502 |
Bad Gateway |
代为代理或网关的服务器无法连接到其父网关 |
503 |
Service Unavailable |
服务器现在无法为请求提供服务 |
504 |
Gateway Timeout |
网关或代理在请求另一服务器响应时超时了 |
505 |
HTTP Version Not Supported |
服务器无法或不愿支持请求的协议版本 |