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的, 只要对应的服务器支持即可. 但是不建议这么使用, 基础的标准规范还是要遵守的.
关于OPTIONS
options请求是用于请求服务器对于某些接口等资源的支持情况的,包括各种请求方法、头部的支持情况,仅作查询使用。这个请求,专业的前端同学应该比较熟悉。
看一个具体例子:
1 |
|
通过curl来发送一个http请求,在响应头中可以发现服务器上这个接口对请求方法以及一些header的使用允许情况,也就是上面说的 获取服务器对于某些资源的选项、支持情况。
另外, OPTIONS还是一种浏览器级行为
我们可以把浏览器自主发起的行为称之为“浏览器级行为”。之所以说options是一种浏览器级行为,是因为在某些情况下,普通的get或者post请求会 首先自动发起
一次options请求,当options请求成功返回后,真正的ajax请求才会再次发起。那么场景有哪些?
- 跨域请求 : 非跨域请求不会出现OPTIONS
- 自定义请求头
- 请求头中的content-type是
application/x-www-form-urlencoded
,multipart/form-data
,text/plain
之外的格式
当满足条件1、2或者1、3的时候,简单的ajax请求就会出现options请求,有没有感觉到一点 同源策略
的意思,个人理解这个就是浏览器底层对于同源策略的一个具体实现。首先得到服务器端的确认,才能继续下一步的操作,这也是为什么options请求也被叫做 “预检”请求
的原因吧。