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 | GET /pageX HTTP/1.1 |
POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录:
1 | POST /add_row HTTP/1.1 -> Adds a 1nd row |
DELETE /idX/delete HTTP/1.1 是幂等的,即使不同的请求接收到的状态码不一样:
1 | DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists |
可缓存
如果要对响应进行缓存,需要满足以下条件:
- 请求报文的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》日,上野宣.