HTTP基础知识 - 请求方法

写在前面

真实开发中, 其实最常用的只有 GET 与 POST , 最多还会有跨域请求预检的 OPTIONS , 只有严格遵照 restful 规范开发 API, 才会用到全部的方法, 但是事实上并不是这样.

HEAD

获取报文首部,并且具有 幂等性 。HEAD请求与GET请求一样,没有请求体。但是与GET区别在于,当使用HEAD进行请求服务器时,服务器 只返回响应头 ,不返回响应体。 常用于

  • 检查请求的URL是否有效,可以通过响应码进行判断
  • 可以根据返回的响应头进行判断资源是否被篡改

PUT

用来向服务器上传文件,并且具有 幂等性 。与POST区别在于:POST用于向服务器 发送数据 ,而PUT用于向服务器 储存数据 。 它自身不带验证机制,导致任何人都可以上传文件,有很大的安全问题,一般不使用该方法。 当使用PUT进行请求时,服务器会使用PUT的请求体的数据创建一个由它请求的URL命名的新文件。没有进行特殊说明,一般PUT请求的请求体 只用于创建或修改 该资源上。如果请求的URL在服务器中不存在,则根据该请求的主体部分创建一个由该请求URL命名的新文档;如果该URL在服务器中已经存在,则用该主体替代他。

DELETE

用于删除服务器上的文件,并且具有 幂等性 。但是服务器并 不是 真正的删除文件,而是给需要删除的文件做一个 标记 ,与PUT功能相反。它也没有验证机制,有很大的安全问题。

PATCH

对资源进行部分修改。与PUT区别在于,PUT是修改所有资源,替代它,而PATCH只是修改部分资源。

OPTIONS

具有 幂等性 。当客户端不清楚对资源操作的方法,可以使用这个请求 询问 服务器该资源支持的请求方法,在响应Header Allow 中返回,比如:Allow: GET, POST, HEAD。它只可以在HTTP 1.1中使用。

TRACE

用来查看一个请求,经过网关,代理到达服务器,最后请求的变换。显示出请求到响应的传输路径。不过有安全漏洞,会泄漏网站信息,被服务器禁止使用。仅在HTTP 1.1版本可以使用。

CONNECT

要求客户端与另一个远程服务器建立一个特殊的隧道,这时候web服务器充当代理角色。仅在HTTP 1.1版本可以使用。 使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议在网络隧道中进行加密传输。

GET 与 POST 的区别

  • 作用不同:GET 用于获取资源,而 POST 用于传输实体主体。
  • 参数位置不一样:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。但是并不是 POST 参数存储在实体主体中就认为它的安全性更高,我们可以通过一些抓包工具如(Fiddler)查看。
  • 安全性:安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。 GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

一种常见的说法 : GET请求有长度限制, POST请求没有, 这种说法正确么?

严格来说,这种说法并不正确.

HTTP GET方法提交的数据大小长度并没有限制. HTTP协议规范也没有限制URL的长度 . 那么很多文章说的GET有大小限制, 又是哪里来的呢? 这个其实一般是指 : 特定的浏览器及服务器对请求的限制

另一种常见说法 : GET没有body , POST 没有 query, 正确么?

严格来讲, 这种说法不正确. GET也是可以有请求body的, 同时post也是可以有请求query的, 只要对应的服务器支持即可. 但是不建议这么使用, 基础的标准规范还是要遵守的.

GET与POST的区别

关于OPTIONS

options请求是用于请求服务器对于某些接口等资源的支持情况的,包括各种请求方法、头部的支持情况,仅作查询使用。这个请求,专业的前端同学应该比较熟悉。

看一个具体例子:

1
2
3
4
5
6
7
8
9
❯ curl -X OPTIONS http://localhost:12580/system/project/detail -i
HTTP/1.1 200 OK
Access-Control-Allow-Headers: Content-Type,AccessToken,X-CSRF-Token, Authorization, Token
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE,UPDATE
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type
Content-Type: application/json; charset=utf-8
Date: Wed, 13 Oct 2021 16:19:29 GMT
Content-Length: 2

通过curl来发送一个http请求,在响应头中可以发现服务器上这个接口对请求方法以及一些header的使用允许情况,也就是上面说的 获取服务器对于某些资源的选项、支持情况。

另外, OPTIONS还是一种浏览器级行为

我们可以把浏览器自主发起的行为称之为“浏览器级行为”。之所以说options是一种浏览器级行为,是因为在某些情况下,普通的get或者post请求会 首先自动发起 一次options请求,当options请求成功返回后,真正的ajax请求才会再次发起。那么场景有哪些?

  1. 跨域请求 : 非跨域请求不会出现OPTIONS
  2. 自定义请求头
  3. 请求头中的content-type是 application/x-www-form-urlencodedmultipart/form-datatext/plain 之外的格式

当满足条件1、2或者1、3的时候,简单的ajax请求就会出现options请求,有没有感觉到一点 同源策略 的意思,个人理解这个就是浏览器底层对于同源策略的一个具体实现。首先得到服务器端的确认,才能继续下一步的操作,这也是为什么options请求也被叫做 “预检”请求 的原因吧。


HTTP基础知识 - 请求方法
http://www.zhangdeman.cn/archives/dc1efeec.html
作者
白茶清欢
发布于
2021年10月13日
许可协议