简介
其实关于HTTP有内容有太多了,光字符集和日期就可以开几篇文章,另外提一嘴此篇文章是基于HTTP1.1的(RFC2616,RFC 7231),关于HTTP我这里就只较为详细讲一下HTTP的请求和响应,无论是请求还是响应,都分三部分,Request/Response Line,Request/Response Header,Request/Response Body,今天暂且讲一下请求行中的请求方法,之前看过不少文章对http请求方法讲述的文章,感觉还是比较简略,这里我详细挖一下。
安全
什么是安全方法呢?就是说你这个方法不会对资源产生副作用(这个副作用就是指创建,修改,删除资源),显然GET和HEAD是安全的,因为他们的定义中就明确了只包含检索。
幂等
这个要用官方的话说就是说多次使用请求方法,其副作用是相同的,这个就是幂等,这个幂等指的是服务器种资源的状态。举个例子,首先我们要知道PUT是幂等的,而POST是非幂等的,一般的话,用PUT用于修改资源,而POST用于创建资源,那么为什么要这么做呢?因为一次修改的请求于多次修改的请求结果是相同的,无论调用多少次同一个(指参数相同)修改,还是一个同一个结果,资源始终是那一个资源。而对于POST请求去创建东西,调用多次的情况下,很可能就创建了多个资源,服务器资源每调一次,就会增加资源,服务器资源状态不一致,所以不幂等。
OPTIONS方法
OPTIONS方法就是获取有关请求/响应链上可用通信选项,而不暗示资源操作或启动资源检索,说人话就是它用于获取当前URL所支持的一些通信选项。以方法为例,作为服务器当你收到这个请求,就要在响应头中响应一个包含了你允许的通信方法的键值对,键为Allow,值为你支持的方法,用逗号隔开,例如GET,POST,他也可以用于测试服务器的合规性(就是说这个服务器做的符不符合HTTP的RFC中定义的标准),测试服务器连通性等等。特点包括
- 响应不可缓存
- 关于 Max-Forwards(请求头里),假如要转发这个请求的话,每转发一次,这个值减1,当为0时,不可转发。
- HTML表单不支持
GET方法
GET方法大家所知道的就是请求指定资源。其实还是有点地方可以挖一下的。对于GET方法,一般有这样的特点,特点包括
- 使用GET方法的请求只应该检索数据。
- GET请求是不建议有正文(Request Body)的。
- GET请求的的响应是可缓存的(没指定Cache-Control)的情况下。
- 关于条件GET(这个没看过RFC文档的同学应该是不大清楚的),篇幅有限,我这里贴一个链接,大家选择性观看
- 安全且幂等
- HTML表单支持
HEAD方法
HEAD 方法与 GET 相同,但是没有Response Body,这种方法通常用于测试超文本链接的有效性、可访问性和最近一次对资源修改的时间。特点包括
- 可缓存
- 安全且幂等
- 不应有响应体
- HTML表单不支持
POST方法
POST方法简单的说就是向指定资源提交数据进行处理请求。具体的RFC指出了四个用法,然后说了一句POST 方法执行的实际功能由服务器确定,另外关于POST 方法的响应,若之前有资源就返回200(成功)或者204(不存在),无资源就返回201表示已经创建。特点包括
- 不可缓存的,除非响应包含适当的 Cache-Control 或 Expires 标头字段(仅在包含新鲜度信息的情况下)。
- 不安全非幂等。
- HTML表单支持
PUT方法
和POST差不多,但是他们是有本质区别,POST的URI代表的是要处理某个封闭的资源,PUT的URI就是指明这个封闭的资源。该怎么理解这个呢?举个例子:如一个用于提交博文的URL为/addBlog。如果用PUT,则提交的URL会是像这样的”/addBlog/abc123”,其中abc123就是这个博文的地址。而如果用POST,则这个地址会在提交后由服务器告知客户端。
- 幂等性但不安全
- 不可缓存
- 不应有响应体
- HTML表单不支持
DELETE方法
DELETE方法请求源服务器删除由Request-URI标识的资源。这个其实没啥好说的,RFC文档上就是说这里的删除是服务器定义的删除(假如你把一个的存在性用一个mark标识,1为存在,0为标识的话,改为0也是删除)
- 幂等但不安全
- 不应有返回体
- HTML表单不支持
TRACE方法
方法用于调用请求消息的远程应用层环回。一般的话就是让这个请求不断forward(),然后看它经过的路径,在这路径上有什么问题,用于测试。
- 不可缓存
CONNECT方法
方法启动与请求资源的双向通信。它可以用来打开隧道。它并非使用在网页开发方面,而是在网关这个看似透明的地方。看下图就明白了

PATCH方法
PATCH应用于局部修改的资源。性质上类似PUT,幂等性上和POST一样,不幂等。
POST,PUT,PATCH区别
区别之一就是他们之间的幂等性。这个我之前说了,然后我简单说一下使用的时候的区别。一般的话POST用于创建资源,PUT用于修改资源,PATCH用于修改部分资源。
这个的原因我解释一下,之前在PUT方法说过,如一个用于提交博文的URL为/addBlog。如果用PUT,则提交的URL会是像这样的”/addBlog/abc123”,其中abc123就是这个博文的地址。而如果用POST,则这个地址会在提交后由服务器告知客户端。从这里可以看出来,PUT是提前知道资源位置的,而POST是不知道,创建之后才被服务器返回知道的。因此如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
再回到前面说的为什么POST用于创建资源,因为创建资源现在数据库用的一般是自增id,所以不知道资源位置,为什么PUT用于修改资源,既是因为其幂等性,也是因为其已经被创建了,客户端一般知道位置。