计算机网络-HTTP方法

警告
本文最后更新于 2020-08-20,文中内容可能已过时。

理解不同的 HTTP 方法的区别,主要参考 RFC 7231

1. 方法的特性

首先是方法的三个属性:安全性、幂等性和可缓存。

1.1 安全性

安全性,safe,指的是该方法在语义上是只读的,不会修改服务器的数据。但即使是安全的方法,服务器也可以更改自己的数据,比如记录此次请求的日志。安不安全仅意味着客户端不需要服务端修改数据,因此不用考虑会对服务端造成危害。

安全的方法也不一定知识对服务端静态资源的请求,服务端可以在请求的时候返回即时生成的资源,只要生成资源的脚本保证是安全的即可:也就是说生成资源的时候没有额外影响。就像在一个电商网站添加删除购物车里的物品一样。

安全的方法有 GET,HEAD,OPTIONS,TRACE。

1.2 幂等性

幂等性,Idempotent,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说,幂等方法不应该具有副作用。

PUT、DELETE 是幂等的,所有安全的方法都是幂等的

幂等只与后端服务器的实际状态有关,比如,DELETE 删除资源后,第二次调用不应当删除另一个资源,否则服务器的状态将不一致,第一次调用会返回 200,但后续的调用就会返回 404。POST 则不一样,连续调用多次,会增加多个相同的资源。

1.3 可缓存

可缓存,Cacheable,指的是可以存储对这些方法的响应以便将来重用。GET、HEAD、POST 方法是可缓存的,不过一般只实现前两个。

2. GET

GET 方法用于请求指定的资源,并且只用于获取数据。

使用 GET 方法时请求报文没有实体部分,但成功的响应有实体部分。

GET 方法是安全的、幂等的、可缓存的。浏览器会主动缓存 GET 方法的响应,如果下一次传输的数据相同,就返回缓存中的内容,以求更快的展示。

GET 方法请求的数据一般附在 URL 之后,以 ?分割 URL 和传输数据,多个参数以 & 连接。由于 URL 一般有长度限制,所以即使 HTTP 并未规定 GET 请求的长度,但实际上受 URL 的长度限制。

3. HEAD

HEAD 方法请求资源的头部信息,该头部信息与 GET 方法请求返回时的一致。常见的使用场景是在下载一个大文件前先获取其大小再决定是否下载,以此节约带宽资源。

如果 HEAD 请求的结果显示上一次 GET 请求后缓存的资源已过期,那么即使没有再次发出 GET 请求,该缓存也会失效。

HEAD 方法是安全的、幂等的、可缓存的。

4. POST

POST 方法发送数据给服务器,因此请求和响应报文都有实体部分,请求报文实体的类型由 Content-Type 首部指定。

POST 请求通常通过表单来发送,此时 content-type 类型是通过在 <form> 元素中设置正确的 enctype 属性, 或是在 <input><button> 元素中设置 formenctype 属性来选择的

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

如果 POST 请求不是通过表单发送,那么实体部分可以是任意类型。

POST 方法不符合安全性和幂等性,但却可以是可缓存的。

由于 POST 方法将提交的数据放在报文的实体部分,因此没有长度的限制。

GET 与 POST 的区别很多都是由于 GET 拼接 URL,POST 传实体部分造成的,包括

  1. 收藏书签:GET可以,POST不可以,因为 URL 可收藏
  2. 保留浏览器历史记录:GET可以,POST不可以,因为 URL 可记录
  3. 安全性:GET 稍低,因为 URL 直接可见,可能被劫持

5. PUT

PUT 方法使用请求报文中的实体部分创建或替换目标资源。它的请求报文有实体部分,但响应报文没有。

PUT 和 POST 的区别在于 PUT 是幂等的,即调用一次与连续调用多次是等价的。举个例子,对于订单提交,多次调用 POST 方法会重复产生多个订单,PUT 方法不会,而是会覆盖掉前一个订单。

使用 PUT 方法时,如果目标资源不存在,则服务器创建一份,并返回 201(Created),通知客户端已创建。如果目标资源已存在,则进行更新,服务器返回 200(OK)或者 204(No Content)表示请求处理成功。

6. DELETE

DELETE 方法用于删除指定的资源,它是幂等的,第一次调用会返回指定资源,第二次会返回 404(Not Found),不会删除另一个资源。

7. CONNECT

CONNECT 方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。

例如,CONNECT 可以用来访问采用了 HTTPS 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。

8. OPTIONS

OPTIONS 方法用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法。

比如,检测服务器所支持的请求方法

1
curl -X OPTIONS http://example.org -i

响应报文首部的 Allow 字段值汇报课该服务器支持的所有 HTTP 方法

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0

9 .TRACE

TRACE 方法使请求的接收者原样返回它收到的消息,一般用于测试或诊断

10. PATCH

PATCH 用于资源的部分修改,不同于 PUT,它是非幂等的,连续多个相同请求会产生不同的效果。

要判断一台服务器是否支持 PATCH 方法,那么就看它是否将其添加到了响应首部 Allow或者 Access-Control-Allow-Methods(在跨域访问的场合,CORS)的方法列表中 。

支付宝
微信
0%