【计算机网络】HTTP 的 Methods

GET 与 POST

GET 是指完整请求一个资源,POST 是指提交表单。

GET 直观上是把参数包含在 url 内,请求获取一个 html 页面、图片、css、js 等资源,浏览器可能会将 GET 请求的 url 地址加入缓存,以便下次访问。

POST 通过 request body 传递参数,提交一个 form 表单, 并得到一个显示提交结果的网页。

从表面上看,两者的区别在于:

  • GET 使用 url 或者 cookie 传参,而 POST 将数据放在 request body 中。
  • GET 方式提交的数据有长度限制,而 POST 的数据可以非常大。
  • POST 比 GET 安全,因为 GET 的数据在浏览器地址栏可见。

以上几个方面并不是他们的本质区别,但至少是表面使用上的区别。两者实际上是相同的,之所以会出现以上的区别,主要原因还是在于一些历史原因和约定俗成的用法。

  • 首先,在 http 协议中,并没有规定 Method 为 GET 时数据参数一定要放在 url 而不能存在 body 且把数据存在 body 中;也没有要求 Method 为 POST 时数据一定要放在 body 中。实际上现代的 Web Server 已经不仅仅支持浏览器使用,他们还都能支持 GET 中包含 body 这样的请求,这些请求通常不由浏览器发出。
  • 其次,http 协议对 GET 和 POST 并没有数据长度的限制。实际上 url 并不存在参数长度上限的说法,反而是一些特定的浏览器对整个 url 的长度会有限制,有些浏览器则取决于操作系统的支持。因为 url 过长的话,服务器处理起来会产生负担,影响服务器的并发响应,有些服务器攻击就是通过告诉服务器 Content-Length 很大,使之长时间响应,从而导致访问超时。
  • 最后,安全性的差异主要在于如果通过 GET 提交数据,像用户名和密码将明文显示在 url 里,由于登录页面有可能被浏览器缓存,这样当别人查看浏览器的历史记录时,就可以得到这组用户名和密码了。但这依然不是 GET 和 POST 的本质区别。

两者的根本区别是:

  • GET 请求是幂等性的,而 POST 不是。(幂等性:一次和多次请求某一个资源应该具有同样的副作用。对于 GET 而言,意味着对同一个 url 的多个请求应该返回同样的结果。)
  • GET 产生一个 tcp 数据包,POST 产生两个 tcp 数据包。

正是由于 GET 请求是幂等的,在网络不好的隧道中会尝试重试,因此如果使用 GET 来实现增删改这些功能,则会有重复操作的风险,容易导致副作用吗,而浏览器和操作系统并不能够识别出这些操作来。

对于 GET 请求,浏览器会把 http header 和 data 一并发送出去,服务器相应状态码 200(返回数据);对于 POST, 浏览器会先发送 header,服务器相应状态码 100(continue)浏览器再发送 data,服务器相应状态码 200(返回数据)。在网络环境良好的情况下,发一次包和发两次包的的时间差别基本可以忽略,而在网络环境差的情况下,两次包的 tcp 在验证数据包完整性上,有非常大的优点。但并不是所有的浏览器再 POST 中都会发送两个包,Firefox 就只发送一次。

总的来说,GET 和 POST 的区别是:

GET POST
使用 url 或者 cookie 传参 将数据放在 request body 中
提交的数据长度有限制 可以处理非常大的数据
参数明文显示在浏览器地址栏中(不够安全)
幂等性 非幂等性
产生一个 tcp 数据包 产生两个 tcp 数据包

其他方法

GET:获取被请求 url 指定的信息实体。

HEAD:获取请求实体的元信息而不需要传输实体主体,因此跟 GET 方法基本一致,元信息也一致。常用于测试超文本链接的有效性、可访问性、和最近的改变。

POST:向服务器提交一个带有实体的请求,其实际功能通常由服务器决定。

PUT:请求服务器把请求中的实体存储在请求 url 的标识下,如果该实体在服务器已经存在,则新请求的实体将被当做所指定实体的修改版本。

DELETE:请求服务器删除请求 url 指定的资源。

TRACE:激发一个远程的、应用层的请求消息回路,该请求中不能包含实体。

CONNECT:用于动态切换到隧道的代理服务器。

OPTIONS:指定资源的通信选项信息。

方法的安全性

  • 执行动作
    • GET 和 HEAD 方法仅仅获取资源而不执行动作,所以往往被考虑是“安全”的;而可以被用户代理的其他方法,如 POST、PUT、DELETE,则可能会执行不安全的动作。
  • 幂等性(Idempotence)
    • GET、HEAD、PUT、DELETE 执行多次请求的结果与执行一次的结果相同;OPTIONS 和 TRACE 具有内在的幂等性
  • 客户端与服务器端的安全性
    • GET、HEAD、OPTIONS 只是从服务器获取资源而不对服务器做任何修改,所以对于服务器端是安全的,但在客户端不安全;
    • POST 影响服务器端的资源。
    • 综上,TRACE 只是记录路径信息,不会引起不安全行为。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章