HTTP协议中的请求方法(HTTP第一讲)

简介

    其实关于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中定义的标准),测试服务器连通性等等。特点包括

  1. 响应不可缓存
  2. 关于 Max-Forwards(请求头里),假如要转发这个请求的话,每转发一次,这个值减1,当为0时,不可转发。
  3. HTML表单不支持

GET方法

    GET方法大家所知道的就是请求指定资源。其实还是有点地方可以挖一下的。对于GET方法,一般有这样的特点,特点包括

  1. 使用GET方法的请求只应该检索数据。
  2. GET请求是不建议有正文(Request Body)的。
  3. GET请求的的响应是可缓存的(没指定Cache-Control)的情况下。
  4. 关于条件GET(这个没看过RFC文档的同学应该是不大清楚的),篇幅有限,我这里贴一个链接,大家选择性观看
  5. 安全且幂等
  6. HTML表单支持

HEAD方法

    HEAD 方法与 GET 相同,但是没有Response Body,这种方法通常用于测试超文本链接的有效性、可访问性和最近一次对资源修改的时间。特点包括

  1. 可缓存
  2. 安全且幂等
  3. 不应有响应体
  4. HTML表单不支持

POST方法

    POST方法简单的说就是向指定资源提交数据进行处理请求。具体的RFC指出了四个用法,然后说了一句POST 方法执行的实际功能由服务器确定,另外关于POST 方法的响应,若之前有资源就返回200(成功)或者204(不存在),无资源就返回201表示已经创建。特点包括

  1. 不可缓存的,除非响应包含适当的 Cache-Control 或 Expires 标头字段(仅在包含新鲜度信息的情况下)。
  2. 不安全非幂等。
  3. HTML表单支持

PUT方法

    和POST差不多,但是他们是有本质区别,POST的URI代表的是要处理某个封闭的资源,PUT的URI就是指明这个封闭的资源。该怎么理解这个呢?举个例子:如一个用于提交博文的URL为/addBlog。如果用PUT,则提交的URL会是像这样的”/addBlog/abc123”,其中abc123就是这个博文的地址。而如果用POST,则这个地址会在提交后由服务器告知客户端。

  1. 幂等性但不安全
  2. 不可缓存
  3. 不应有响应体
  4. HTML表单不支持

DELETE方法

    DELETE方法请求源服务器删除由Request-URI标识的资源。这个其实没啥好说的,RFC文档上就是说这里的删除是服务器定义的删除(假如你把一个的存在性用一个mark标识,1为存在,0为标识的话,改为0也是删除)

  1. 幂等但不安全
  2. 不应有返回体
  3. HTML表单不支持

TRACE方法

     方法用于调用请求消息的远程应用层环回。一般的话就是让这个请求不断forward(),然后看它经过的路径,在这路径上有什么问题,用于测试。

  1. 不可缓存

CONNECT方法

     方法启动与请求资源的双向通信。它可以用来打开隧道。它并非使用在网页开发方面,而是在网关这个看似透明的地方。看下图就明白了


image.png

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用于修改资源,既是因为其幂等性,也是因为其已经被创建了,客户端一般知道位置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容