HTTP中的方法
客户端发送的请求报文的第一行是请求行,里面包含了请求的方法字段。
一、GET
GET方法通常用于获取资源。在GET请求中一般不会包含呈现数据(如HTML文本、图片、视频等)。
二、HEAD
获取报文的首部。和GET方法是一样的,但是他不反悔报文实体的主体部分。主要用于确认URL的有效性以及资源更新的日期时间等。
三、POST
一般用于传输实体主体,主要用来传输数据。
GET和POST的区别
作用
GET主要用来获取资源、POST主要用来传输实体主体(数据)。
参数
GET和POST的请求都能使用额外参数,但是GET的参数是以查询字符串出现在URL中,而POST的参数存储在实体主体中。
/**GET方式**/
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
/**POST方式**/
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
但是不能因为POST参数存储在实体主体中就认为它的安全性高,因为照样可以通过一些抓包工具(如:Fiddler)查看。
因为URL只支持ASCII码,因此GET中的参数如果存在中文等字符就需要先进行编码,在服务器进行解码。POST请求支持标准字符集。
安全
安全的HTTP方法不会改变服务器的状态,也就是它只是可读的。
GET方法是安全的(因为大部分情况下只用来获取数据),而POST方法不是的,因为POST的作用是传送实体主体的内容(用于增减删除修改数据库等),也就是服务器的状态发生了改变。
安全的方法除了 GET 之外还有:HEAD、OPTIONS(下面会说到)。
不安全的方法除了POST之外还有:PUT、DELETE。
幂等性
幂等性的HTTP方法,同样的请求被执行一次与连续执行多次的结果是一样的,服务器的状态也是一样的。通常情况先 GET、HEAD、PUT和DELETE、OPTIONS等方法都是幂等性的,而POST方法却不是。所有的安全方法都是幂等性的。
GET /pageX HTTP/1.1
是幂等的。连续调用多次,客户端接收到的结果都是一样的:
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
POST /add_row HTTP/1.1
不是幂等的。如果调用多次,就会增加多行记录:
POST /add_row HTTP/1.1
POST /add_row HTTP/1.1 -> Adds a 2nd row
POST /add_row HTTP/1.1 -> Adds a 3rd row
DELETE /idX/delete HTTP/1.1
是幂等的,即便是不同请求之间接收到的状态码不一样:
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 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
补充:
响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
响应报文的 Cache-Control 首部字段可以指定是否进行缓存。
XMLHttpRequest
XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。
在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。而 GET 方法 Header 和 Data 会一起发送。
四、PUT
一般用于上传文件,由于PUT方法本身不带验证机制,任何人都可以上传文件,因此存在安全问题,一般我们不使用此方法。
PUT /new.html HTTP/1.1
Host: example.com
Content-type: text/html
Content-length: 16
<p>New File</p>
PUT和POST的最大区别是一个是幂等性的一个不是幂等性的。(幂等性见上面GET和POTS区别分析部分)
五、PATCH
对资源进行部分修改,虽然PUT也可以用于修改资源,但是它只能完全替代原始资源,而PATCH可以允许对资源进行部分修改。
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 100
[description of changes]
六、DELETE
删除文件,它与PUT的功能相反,一般用于删除文件,不带验证机制。不安全。
DELETE /file.html HTTP/1.1
七、OPTIONS
查询指定URL能够支持的方法。
会返回Allow:GET、POST、HEAD、OPTIONS这样的内容。
八、CONNECT
要求使用隧道连接技术,要求在与代理服务器通信时建立隧道,使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
CONNECT cnn.com:443 HTTP/1.1
![](https://i.imgur.com/T0Xy7Jo.png)
九、TRACE
路径追踪
服务器会将通信路径返回给客户端。发送请求时,在 Max-Forwards
首部字段中填入数值,每经过一个服务器就会减1,当数值为0时就会停止传输。通常不会使用TRACE,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪)。