认识 HTTP/1.1 协议中使用的方法
在 HTTP/1.1 协议所有可以被使用到的方法中,相信大家最熟悉的就是 GET 和 POST 这两个方法了。其实,除了 GET 和 POST 方法之外,在 HTTP 1.1 协议中还有很多其它的方法,例如:PUT、DELETE、HEAD、OPTIONS 等等。这些不同方法的作用在于,可以指定请求的 URI 资源按期望产生某种行为。本文就来介绍一下 HTTP 中使用的方法。
GET:获取资源
#方法 URI 协议/协议版本
GET /blog/understanding-url-and-url/ HTTP/1.1
Host: www.yaohaixiao.com
GET 方法用来请求访问已被 URI 识别的资源,简单点说就是用来获取资源。
客户端(浏览器)发送一个 GET 请求,请求指定的资源经过服务器解析后返回响应内容。这里的“服务解析”指的是,如果请求的资源是文本类型的,服务器就可以直接将文本请求返回。如果请求的是 CGI 或者 PHP 之类的程序,则服务器返回的是程序解析后的输出结果。
GET 方法可以生成锚点,这有助于通过查询访问 CGI 程序,而无需使用表单。查询被构造成一个链接,因此当访问该链接时,CGI 程序将从数据库中检索合适的信息。
GET 方法广泛用于搜索引擎。在用户向搜索引擎提交查询后,引擎执行查询并给出结果页面。查询结果可以设置为链接(书签)。
GET 方法存在一些安全问题,因为插入的查询字符串数据在 URL 中可见。当需要在表单中填写敏感信息时,使用 GET 方法是不合适的。当用户需要填写密码或其他机密信息时,POST 方法很有用。
另外,通过 GET 方法只能传递有限数量的数据,因为浏览器可以遍历的 URL 长度可能是一千个字符。
POST:传输实体主体
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: www.yaohaixiao.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Proxy-Connection: keep-alive
Content-Length: 126
POST 方法用来传输实体的主体。GET 和 POST 的功能很相似,但 POST 的主要目的并不是获取响应的主体内容,而是传输实体主体。虽然用 GET 方法也可以传输实体,但一般都是用 POST 方法传输实体主体,POST 方法适用于大量信息(实体的主体)传输的情况。

如图所示,这是通过 POST 发送的一个上传图片的请求,图中的 Form Data 数据就是 POST 请求传输的实体主体,也就是表单数据中包含的上传图片的数据。而这种实体数据的传输 GET 请求是无法处理的。
POST 方法需要与 Web 服务器建立两个联系,而 GET 只建立一个。POST 中的请求的管理方式与 GET 方法中的管理方式相同,其中空格用加号 (+) 表示,其余字符在 URL 模式中编码。它还可以发送文件的项目。
POST 与 GET 的区别
- GET 方法将参数放在 URI 中,而 POST 方法将参数附加到正文(实体的主体)中;
- GET 主要用于获取信息。相反,POST 方法的目的是更新(传输)数据;
- POST 查询结果不能添加书签,而 GET 查询结果可以添加书签,因为它以 URL 的形式存在;
- 在 GET 方法中,信息在 URL 中可见,这增加了漏洞和黑客攻击的风险。相比之下,POST 方法在 URL 中不显示变量,并且可以在其中使用多种编码技术,这使其具有弹性;
- 在表单中使用 GET 方法时,数据类型只接受 ASCII 字符。POST 方法不绑定表单数据类型,允许二进制和 ASCII 字符;
- GET 方法中的可变大小约为 2000 个字符。POST 方法则允许多达 8 Mb 的可变大小;
- GET 方法数据可缓存,而 POST 方法数据不可缓存;
PUT:传输文件
PUT /wp-admin/admin-ajax.php HTTP/1.1
Host: www.yaohaixiao.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 126
PUT 方法是用来传输文件的。要求在请求的主体中包含文件内容,然后保存到请求 URI 指定的位置。
但是,由于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以直接通过 PUT 方法请求上传文件的 URI 地址上传文件,存在安全问题。所以向本站这样的站点都是通过 POST 方法上传文件。不过,如果上传文件的接口采用了验证机制,例如遵循 REST 标准,采用 JWT 验证机制后,就可以使用 PUT 方法了。
另外,在实际的应用中,很多 Web 应用的接口使用 PUT 方法做更新数据类的操作。
DELETE:删除文件
DELETE /wp-admin/admin-ajax.php HTTP/1.1
Host: www.yaohaixiao.com
DELETE 方法用来删除文件,与 PUT 正好相反。DELETE 与 PUT 一样的是 HTTP/1.1 中的 DELETE 也不带验证机制,也需要配合验证机制后才可安全使用。而在实际的应用中,DELETE 方法通常用来处理删除数据类的操作。
HEAD:获得报文首部
HEAD /blog/understanding-url-and-url/ HTTP/1.1
Host: www.yaohaixiao.com
HEAD 方法与 GET 方法类似,只是请求返回的数据中只有报文首部信息,而没有主体内容部分。HEAD 方法主要用于确认 URI 的有效性和资源的更新时间等信息。这个方法在实际开发中使用的比较少。
OPTIONS:询问支持的方法
OPTIONS /blog/understanding-url-and-url/ HTTP/1.1
Host: www.yaohaixiao.com
OPTIONS 方法用来查询针对请求 URI 指定资源支持的方法。普通的 Web 应用几乎不会使用此方法。
TRACE:追踪路径
TRACE /blog/understanding-url-and-url/ HTTP/1.1
Host: www.yaohaixiao.com
Max-Forwards: 3
TRACE 方法是用来让服务器端将之前的请求i通信返回给客户端的方法。发送请求时,在 Max-Forwards 首部设置数值,每经过一个(中转)服务器端,设置的数值就减 1,当设置的数值递减为 0 时,就停止传输,最后接受到的服务端返回的 200 的状态码响应。
TRACE 方法会记录请求发送,经过中专服务器,知道最终到达目标服务器整个过程中发生的一系列操作。客户端可以通过 TRACE 方法查询发送的请求是怎样加工修改,或者是如何被篡改的。
但是,TRACE 方法容易引发 XST(Cross-Site Tracing,跨站追踪)攻击,所以 TRACE 方法很少会在实际的 Web 开发中使用。
CONNECT:要求用隧道协议连接代理
CONNECT 代理服务器名:端口号 HTTP/1.1
Host: www.yaohaixiao.com
CONNECT 方法要求与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL 和 TSL 协议将通信内容加密后通过建立的隧道传输。
另外,HTTP/1.1 协议中将原来 HTTP/1.0 中包含的 LINK 和 UNLINK 方法作废了。