HTTP请求方法

一. OPTIONS

作用:获得请求/响应过程中,目标资源(URI指定的资源)可以使用的通信选项信息;检查服务器的性能。

注意:该方法的响应是不能缓存的。

二. GET

作用:获取被请求URI指定的信息。

注意:该方法的响应是可缓存的(如果此响应满足HTTP缓存的要求)。

说明: 

(1) 如果请求消息包含If-Modified-Since,If-Unmodified-Since,If-Match,If-None-Match或者If-Range头域,GET的语义将变成“条件GET”
    ,它会请求满足条件头域的实体,其目的是为了减少不必要的网络使用;

(2) 如果请求方法包含一个Range头域,那么GET方法就变成“部分Get”,它只会从服务器获取实体的部分数据(客户端已经拥有的实体数据不会获取),
    其目的是为了减少不必要的网络使用。

三. HEAD

作用:获取请求实体的头域信息而不需要传输实体主体。它经常被用来测试超文本链接的有效性,可访问性,和最近的改变。

注意:该方法的响应是可缓存的。

四. POST

作用:请求服务器,让其接受请求中的实体,以作为被请求资源的一个新的从属物。

注意:

(1) 该方法的响应是不可缓存的,除非响应里有合适的Cache-Control或者Expires头域;

(2) 状态为303的响应能被用户代理利用,从而获得可缓存的响应。

说明:POST方法的实际功能由服务器决定,并且经常依赖于请求URI。

五. PUT

作用:把请求里的实体存储到被请求的资源中。

注意:该方法的响应是不可缓存的。

说明:

(1) 如果被请求的资源已经存在,那么请求里的实体,应当被作为被请求资源实体的最新修改版本;

(2) 如果被请求的资源不存在,且此资源被用户代理定义为一个新资源,那么服务器就应该根据请求里的实体创建该资源;

(3) 如果一个新资源被创建了,服务器必须向用户代理发送201(已创建)响应;

(4) 如果已存在的资源被改变了,那么服务器应该发送200或204(无内容)响应;

(5) 如果资源不能根据请求URI创建或改变,服务器应该给出一个合适的错误响应,以反应问题的性质;

(6) 实体的接收者不能忽略任何它不理解和不能实现的Content-*头域,且必须返回501(没有实现)响应。

POST与PUT请求最根本的区别,是请求URI的含义不同:

(1) POST请求里的URI,指示一个能处理请求实体的资源(如一段程序);

(2) PUT请求里的URI,标识请求里封装的实体,且服务器不能把此请求应用于其他资源。

六. DELETE

作用:从服务器删除URI指定的资源。

注意:该方法的响应是不能被缓存的。 

说明:

(1) 如果响应里包含描述成功的实体,响应应该是200;

(2) 如果DELETE动作还未执行,那么应该以202(已接收)响应;

(3) 如果DELETE动作已执行但响应不包含实体,那么应该以204(无内容)响应。

七. TRACE

作用:让客户端测试到服务器的网络通路。

注意:该方法的响应是不能被缓存的。

说明:

(1) TRACE请求不能包含一个实体;

(2) 如果请求是有效的,响应头应该包含一个"Content-Type: message/http"的头域,响应体应该包含整个请求信息。

八. CONNECT

作用:动态切换到隧道的代理。

注意:这是HTTP 1.1协议规范保留的一个方法。

九. 等幂方法

1. 什么是等幂?

等幂就是值不变性,相同的请求得到相同的响应结果。

2. 哪些方法是等幂的?

GET,HEAD,PUT,DELETE,OPTIONS,TRACE方法都是等幂的。

HTTP头域定义

一. Axx

1. Accept

作用:指定客户端可以接受的媒体类型,如Accept:text/html,application/*;q=0.9,*/*;q=0.8。

说明:

(1) "*/*"指明了所有的媒体类型;

(2) "type/*"指明了type类型的所有子类型;

(3) "q"参数指明了对该媒体类型的喜爱程度,其取值范围为0~1,默认为1。

2. Accept-Charset

作用:指定客户端可以接受的字符集,如Accept-Charset: iso-8859-5;q=0.8。

说明:

(1) 如果“*”出现在Accept-Charset头域里,那么将匹配任何Accept-Charset头域里没有的字符集(包含ISO-8859-1);

(2) 如果“*”没有出现在Accept-Charset头域里,那么所有未在Accept-Charset头域里显式声明的字符集,其q值都为0,但当ISO-8859-1没有被显式声明时,其q值为1;

(3) 如果没有指定Accept-Charset头域,那么默认会接受任何字符集;

(4) 如果指定了Accept-Charset头域,但服务器响应的字符集不是Accept-Charset所指定的,那么服务器应当发送一个406(不能接受的)错误状态响应;

(5) "q"参数指明了对该字符集的喜爱程度,其取值范围为0~1,默认为1。

3. Accept-Encoding

作用:指定客户端可接受的内容编码,如Accept-Encoding: compress;q=0.5,identity;gzip;q=1。

说明:

(1) 如果一个内容编码在Accept-Encoding头域中出现,那么它是可以接受的,除非其q值为0;

(2) 如果"*"在Accept-Encoding头域中出现,那么它会匹配任何没有出现在头域里的可得内容编码;

(3) 如果请求头指定了Accept-Encoding,但其值为空,那么只有"identity"编码是可接受的;

(4) 如果请求头里指定了Accept-Encoding,但服务器不能发送一个Accept-Encoding头域里指定的编码响应,那么服务器应该发送一个406(不接受的)错误的响应;

(5) 如果请求头里没有指定Accept-Encoding,那么服务器会假设客户端接受任何内容编码。

4. Accept-Language

作用:指定客户端可接受的自然语言,如en-gb;q=0.8, en;q=0.7。

5. Accept-Range

作用:它允许服务器向客户端指明服务器对范围请求的接受度。

6. Age

作用:表明从服务器产生响应到现在,所经过的时间。

说明:Age值是十进制非负整数,且以秒为单位。

7. Allow

作用:表明被请求资源所支持的请求方法,如Allow: GET, HEAD, PUT。

8. Authorization

作用:表明客户端希望服务器给自己授权。

二. Cxx

9. Cache-Control

作用:用于指定在请求/响应链上,必须被所有缓存机制遵守的指令,如Cache-Control:缓存指令。

缓存指令:

(1) public

描述:指明响应可被任何缓存保存。

(2) private

描述:指明响应的部分或所有部分是为某一个用户准备的,且不得被共享缓存保存。

(3) no-cache

描述:它允许源服务器去防止响应被缓存保存。

(4) no-store

描述:指示缓存不保存响应的任何部分。

(5) max-age

描述:表明客户端愿意接受存活时间不大于max-age值(秒)的响应。

(6) min-fresh

描述:表明客户端愿意接受保鲜时间不小于min-fresh值(秒)的响应。

(7) max-stale

描述:表明客户端愿意接受已经过期的响应。

注意:

  a. 若客户端请求为max-age指定了一个值,则表明客户端愿意接受过期时间未超过max-stale值(秒)的响应;

  b. 若max-stale没有赋值,则表明客户端愿意接受任意年龄的过期响应。

(8) no-transform

描述:表明代理不能在包含该指令的消息中改变或添加这些头域:Content-Encoding,Content-Range,Content-Type。

10. Connection

作用:表示客户端与服务器通信时处理长连接的方式。

说明:

(1) Connection头域可以出现在请求/响应头中;

(2) Connection: close头域,无论出现在请求头还是响应头里,都表明在完成现有请求/响应后,连接将被关闭。

11. Content-Encoding

作用:在不丢失下层媒体类型的标识下,对文档进行压缩,如Content-Encoding: gzip。

12. Content-Language

作用:描述实体所支持的自然语言,如Content-Language:en。

说明:

(1) Content-Language可应用于任意媒体类型,它不限于文本式的文档;
(2) 如果未指定Content-Language,则表明内容支持所有语言。

13. Content-Length

作用:指明发送给接收者的实体主体大小(以十进制的字节数表示),如Content-Length:3495。 

说明:任何大于或等于0的Content-Length均为有效值。

HTTP状态码

一. 1xx(通知)

1. 100(继续)

语义:告诉客户端应该继续请求。

2. 101(切换协议)

语义:告诉客户端,服务器已切换了协议。

说明:

(1) 当客户端在Upgrade头域中指定了它所支持的附加通信协议后,服务器便可能进行协议切换(当服务器觉得可以进行切换时);

(2) 一旦服务器进行了协议切换,就必须给客户端一个101响应,且在Upgrade头域中指明哪个协议被切换了。
HTTP/1.0没有定义任何1xx状态码。

二. 2xx(成功)

1. 200(成功)

语义:客户端请求已经成功。

2. 201(已创建)

语义:请求已经被服务器满足且已经创建了一个新的资源。

说明:新创建资源的URI,在响应的实体里返回,但此资源最精确的URI是在Location头域里给出。

3. 202(已接受)

语义:请求已被接受去处理,但还没有处理完成。

4. 203(非权威信息)

语义:响应里的头域信息不是来自服务器,而是从本地或第三方响应副本里收集的。

5. 204(无内容)

语义:服务器已满足了请求,但只返回了更新后的头域信息。

6. 205(重置内容)

语义:服务器告知客户端,应该重置发送请求的页面(主要用于清空页面中的表单输入框)。

7. 206(部分内容)

语义:服务器已经完成了客户端对资源的"部分GET"请求。

三. 3xx(重新定向)

1. 300(多个选择)

语义:被请求的资源对应多个表现形式,每个表现形式都有一个特定的位置,需要用户代理选择一个更合适的表现形式,并重定向到该表现形式的位置。

2. 301(永久移动)

语义:被请求资源有了新的永久URI,且任何对此资源的引用都会利用此301状态响应返回的URI。

说明:新的永久URI会在响应中的Location头域指定。

3. 302(发现)

语义:请求的资源暂时存放在一个不同的URI下。

说明:临时的URI会在响应的Location头域里指定。

4. 303(见其他)

语义:当前请求的响应可以在另一个URI上被找到,且客户端应当采用GET方法获得那个资源。

说明:

(1) 新的URI会在响应的Location头域里指定;

(2) 新的URI并不是原始请求资源的代替引用。

5. 304(没有改变)

语义:被请求的资源没有被改变。

6. 305(使用代理)

语义:被请求资源必须通过代理访问。

说明:代理的URI在响应的Location头域指定。

7. 306(没有使用的)

说明:该状态码被用于HTTP/1.1以前的版本(在HTTP/1.1中也被保留),是不再使用的意思。

8. 307(临时重发)

语义:请求的资源临时存在于一个不同的URI下。

说明:临时URI在响应的Location头域里指定。

疑问:与302的区别是什么?(规范中无说明)

四. 4xx(客户端错误)

1. 400(坏请求)

语义:当前请求包含语法错误,不能被服务器理解。

2. 401(未授权的)

语义:服务器需要对请求进行用户认证。

3. 402(必需的支付)

说明:此状态码为将来的应用保留。

4. 403(禁用)

语义:服务器拒绝当前请求。

5. 404(没有找到)

语义:在服务器上没有找到被请求的资源。

6. 405(方法不被允许)

语义:当前的请求方法,对于被请求的资源来说是不允许的。

说明:在响应的Allow头域里,会列出当前资源所支持的请求方法。

7. 406(不可接受的)

语义:根据客户端请求的接受头域(如:Accept, Accept-Charset, Accept-Encoding, 或Accept-Language),服务器不能产生让客户端可以接受的响应。

8. 407(需要代理验证)

语义:客户端必须在代理服务器上进行身份验证。

说明:代理服务器的响应中,必须包含一个Proxy-Authenticate头域,用以进行身份询问。

9. 408(请求超时)

语义:客户端没有在服务器预备等待的时间内完成一个请求的发送。

10. 409(冲突)

语义:由于被请求的资源和其当前状态存在冲突,请求无法完成。

11. 410(不存在)

语义:被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。

说明:它与404的区别在于,410表示该状况是永久性的。

12. 411(长度必需)

语义:服务器拒绝接受没有包含Content-Length头域的请求。

13. 412(先决条件失败)

语义:请求头域里指定的先决条件,在当前服务器上测试为false。

14. 413(请求实体太大)

语义: 请求实体太大,服务器拒绝处理请求。

15. 414(请求URI太长)

语义:请求URI太长,以至于服务器不能解析。

16. 415(不被支持的媒体类型)

语义:请求中提交的实体,并不是服务器中所支持的格式,请求被拒绝。

17. 416(请求范围不满足)

语义:如果请求中包含了Range头域,且Range中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义If-Range头域,那么服务器就应当返回416状态码。

18. 417(期望失败)

语义:在请求头域Expect中指定的预期内容,无法被服务器满足,或者该服务器是一个代理服务器,它有明显的证据证明,在当前路由的下一个节点上,Expect的内容无法被满足。

五. 5xx(服务器错误)

1. 500(服务器内容错误)

语义:服务器遇到了一个未曾预料的状况(一般都是程序出错),导致了它无法完成对请求的处理。

2. 501(不能实现)

语义:服务器没有能力处理该请求。

3. 502(坏网关)

语义:作为网关或者代理工作的服务器,尝试执行请求时,从上游服务器收到无效的响应。

4. 503(服务不能获得)

语义:由于临时的服务器维护或者过载,服务器当前无法处理请求。

说明:这个状况是临时的,并且将在一段时间以后恢复。

5. 504(网关超时)

语义:作为网关或者代理工作的服务器,尝试执行请求时,未能及时从上游服务器或者辅助服务器(例如DNS)收到响应。

说明:某些代理服务器在DNS查询超时时,也会返回400或者500错误。

6. 505(HTTP版本不支持)

语义:服务器不支持,或者拒绝支持在请求中使用的HTTP版本。