HTTP中的方法

HTTP中的方法

GET:获取资源

GET方法用来请求访问已被URI识别的资源。指定资源经服务器端解析后返回响应内容。

POST:传输实体主体

POST方法用来传输实体的主体

虽然用GET方法也可以传输实体的主体,但是一般不用GET方法。

PUT:传输文件

用来传输文件,就像FTP协议的文件上传。

HEAD:获取报文首部

HEAD 方法和 GET 方法一样, 只是不返回报文主体部分。 用于确认
URI 的有效性及资源更新的日期时间等

DELETE: 删除文件

DELETE 方法用来删除文件, 是与 PUT 相反的方法。 DELETE 方法按
请求 URI 删除指定的资源 。

OPTIONS:询问支持的方法

OPTIONS方法用来查询针对请求URI指定的资源支持的方法

TRACES:追踪路径

TRACE方法是让web服务器端将之前的请求通信环回给客户端的方法。

Connect:要求用隧道协议代理链接

CONNECT 方法要求在与代理服务器通信时建立隧道, 实现用隧道协
议进行 TCP 通信。 主要使用 SSL(Secure Sockets Layer, 安全套接
层) 和 TLS(Transport Layer Security, 传输层安全) 协议把通信内容
加 密后经网络隧道传输。

HTTP/1.0和HTTP/1.1

支持的方法

方法 说明 支持的 HTTP 协议版本
GET 获取资源 1.0、 1.1
POST 传输实体主体 1.0、 1.1
PUT 传输文件 1.0、 1.1
HEAD 获得报文首部 1.0、 1.1
DELETE 删除文件 1.0、 1.1
OPTIONS 询问支持的方法 1.1
TRACE 追踪路径 1.1
CONNECT 要求用隧道协议连接代理 1.1
LINK 建立和资源之间的联系 1.0
UNLINE 断开连接关系 1.0
GET和POST对比
作用

GET用于获取资源,而POST用于传输实体主体。

参数

GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。

因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87,而空格会转换为 %20。POST 参数支持标准字符集。

因为GET是通过URL提交数据的,所以GET可提交的数据量就和URL的长度有关。HTTP没有限制URL长度,但浏览器会限制URL长度

而POST方法则是把提交的数据放置在HTTP包的包体中。

连接

对于GET方式请求,浏览器会把http header和data一并发送出去,服务器响应200。

对于POST方式请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK。但是不是所有的浏览器都会发送两次包,比如火狐。

安全

安全的HTTP方法不会改变服务器状态,它只是可读的。

GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

安全的方法除了 GET 之外还有:HEAD、OPTIONS。

不安全的方法除了 POST 之外还有 PUT、DELETE。

在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。

幂等性

GET /pageX HTTP/1.1 是幂等的,连续调用多次,客户端接收到的结果都是一样的:

1
2
3
4
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1Copy to clipboardErrorCopied

POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录:

1
2
3
POST /add_row HTTP/1.1   -> Adds a 1nd row
POST /add_row HTTP/1.1 -> Adds a 2nd row
POST /add_row HTTP/1.1 -> Adds a 3rd rowCopy to clipboardErrorCopied

DELETE /idX/delete HTTP/1.1 是幂等的,即使不同的请求接收到的状态码不一样:

1
2
3
DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1 -> Returns 404
可缓存

如果要对响应进行缓存,需要满足以下条件:

  • 请求报文的HTTP方法是可以缓存的,包括GET和HEAD,但是PUT和DELELTE不可缓存,POST在多数情况下不可缓存。
  • 响应报文的状态码时刻缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
  • 响应报文的Cache-Control首部字段没有指定不可缓存。
XMLHttpRequest

为了阐述POST和GET的另一个区别,需要先了解XMLHttpRequest:

XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。

  • 在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。
  • 而 GET 方法 Header 和 Data 会一起发送。

参考文献

《图解HTTP》日,上野宣.

9%的人理解错 HTTP 中 GET 与 POST 的区别

HTTP中Get与Post的区别