文章目录
1. Request
- 用
|
隔开的元素代表选择 - 用
()
括起来的元素会被当作同一个元素 *
语法的完整形式是<n>*<m>element
,其语义是最少n
个,最多m
个,如果省略m\n
,则表示任意个,包含0
CRLF
:- Carriage-Return: 回车
'\x0d'
,光标移动到一行前面; - Line-Feed: 换行
'\x0a'
,光标移动到下一行 - 在windows下实现换行需要\r\n,而在UNIX,Linux下只要\n即可;
- Carriage-Return: 回车
[ element ]
相当于*1( element)
,也就是至多一个
所以一个完整的请求报文是:
- 请求行
- 请求头+CRLF(可选)
- CRLF
- 请求体(至多一个)
2. Request-Line
语义明确,方法+空格+URI+空格+版本+CRLF
2.1 Method
- 当服务器对请求的方法
可识别但不支持
的时候,需要返回405(method not allowed)
- 而服务器对请求方法无法识别的时候,需要返回
501(Not Implemented)
- 所有一般用途(general-purpose)的服务器
必须支持
GET和HEAD,其余的方法则是可选择的 - 支持了方法,就要支持其语义
2.1.1 OPTIONS
2.1.2 GET
- 语义是获取URI所指定的资源
- 如果URI指向一个数据处理过程,则应将该处理过程的结果作为实体返回,而非将过程文本作为实体,除非其处理结果即为其本身文本
- 当header中包含If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, If-Range时,语义为满足条件则获取。该行为目的时减少不必要的网络传输
- 当header中包含Range时,语义为部分传输,该行为目的亦为减少不必要的网络传输
- 当且仅当有HTTP缓存需求的时候,GET的响应才是可以被缓存的(todo)
- 当使用form的时候需要考虑的安全问题(todo)
2.1.3 HEAD
- 除了不包含响应体,其余内容应该与GET请求得到的响应相同
- 该方法常用作测试连接的正确性、可达性以及验证最近的调整
- HEAD的响应可能会被缓存,当相应被用来更新缓存实体的时候(Content-Length, Content-MD5, ETagor Last-Modified 可以判断缓存是否过期)
2.1.4 POST
- POST的本意是设计一个通用的方法,其功能涵盖:对资源的注解、给邮件列表/公告栏等发送消息、提供数据块(如form表单)以及给数据库追加数据,但实际上的功能还是要看服务器,更准确的说是URI指向的资源的行为来确定
- 对于POST来说,状态码
200(OK) 204(No Content)
都是合适的相应状态,这取决于响应是否包含响应实体 - 如果服务器创建了一个资源,应该返回
201(Created)
,且需要包含一个响应实体来描述响应状态以及新建资源的指向,并且有一个Location
header - POST的响应式不能不缓存的,除非响应响应中包含了Cache-Control 或者Expires header。(缓存行是客户端的行为)
- POST请求必需遵循的信息传输要求(todo)
2.1.5 PUT
- 如果资源不存在,则创建资源来对应URI,若已经存在,应该当作一个更新版本(覆盖)
- 如果新资源创建,必需返回
201(Created)
- 如果资源更新,应该返回
200(Ok)
或204(Not Content)
- 如果创建或更新失败,则应返回一个合适的错误响应来指明这个问题
- 如果header中有任何形如
Content-*
的,不能识别或应用的,服务器应返回```501(Not Implemented) - 如果这个request途径缓存,而请求中的URI指定的资源在缓存中,那这些资源应该被标记为过期(stale)
- PUT请求中的实体头应该被应用于新建的资源,除非特别指定了实体头
- PUT请求必需遵循的信息传输要求(todo)
PUT与POST的取别主要体现在URI的意义上:
- POST认为URI是一个数据处理程序,会有响应的逻辑处理POST过去的数据
- PUT认为URI是指向一个数据,而且,服务器不能处理的时候,也不能交由别的URI去处理,而是应该返回一个
301(Moved Permanently)
,由客户端决定是否重新访问重定向地址
2.1.6 DELETE
- 这个行为可能会被服务器覆盖,即便是返回的状态码表示已经删除成功,所以,这个行为是得不到保障的,另一方面,服务器也应该在成功删除的时候再返回成功的状态码
- 如果途径缓存,则URI中的资源应被标记为过期
- 响应不可被缓存
- 返回的状态码:
- 如果成功且包含响应实体:
200(Ok)
- 如果成功但无响应实体:
204(Not Content)
- 如果尚未执行:
202(Accepted)
- 如果成功且包含响应实体:
2.1.7 TRACE
- 调用一个远程应用层消息回路(请求并获得响应)
- 请求不能包含请求实体
- 最终的接收者要么是服务器,要么是第一个接收到Max-Forwards为
0
的代理或网关 - Via头域可以作为请求链的跟踪信息。Max-Forwards设置请求链的长度,这在测试消息传递是否存在无限循环时十分有用
2.1.8 CONNECT
保留,为了以后和可以动态转变成隧道的代理一起使用
2.2 URI
3. request-header
名称 | 作用 |
---|---|
Accept | 客户端接受的数据格式 |
Accept-Charset | 客户端接受的字符集 |
Accept-Encoding | 可接受的编码方式 |
Accept-Language | 可接受的自然语言,q=0.7代表偏好值,默认1 |
Authorization | 客户端非要亮明身份,虽然没必要 |
Expect | 指定服务器的行为,如果服务器不识别,要返回417(Exception Failed) |
From | 如果有,是一个用户邮箱 |
Host | |
If-Match | 根据实体标签判断是否匹配 |
If-Modified-Since | 如果在此之后有更新 |
If-None-Match | |
If-Range | if the entityis unchanged, send me the part(s) that I am missing; otherwise, send me the entire new entity |
If-Unmodified-Since | 如果在此之后没有更新 |
Max-Forwards | TRACE中的最远距离 |
Proxy-Authorization | 有的代理会要求验证,这个字段就是客户端提供验证信息的 |
Range | 因为所有响应实体都是二进制序列,所以这个字段对任意实体都有效 |
Referer | |
TE | |
User-Agent |