在 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 的区别

  1. GET 方法将参数放在 URI 中,而 POST 方法将参数附加到正文(实体的主体)中;
  2. GET 主要用于获取信息。相反,POST 方法的目的是更新(传输)数据;
  3. POST 查询结果不能添加书签,而 GET 查询结果可以添加书签,因为它以 URL 的形式存在;
  4. 在 GET 方法中,信息在 URL 中可见,这增加了漏洞和黑客攻击的风险。相比之下,POST 方法在 URL 中不显示变量,并且可以在其中使用多种编码技术,这使其具有弹性;
  5. 在表单中使用 GET 方法时,数据类型只接受 ASCII 字符。POST 方法不绑定表单数据类型,允许二进制和 ASCII 字符;
  6. GET 方法中的可变大小约为 2000 个字符。POST 方法则允许多达 8 Mb 的可变大小;
  7. 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 方法作废了。

分类: Blog