HTTP请求方法
方法的特性
HTTP 请求方法是包含在 HTTP 请求报文的信息,用来表示如何传递请求数据,以及如何获取服务器资源的方式。
安全性:HTTP 方法安全性的定义是不会修改服务器的数据,也就是请求方法只会请求读取服务器数据;所有安全的方法都是幂等的。
幂等性:idempotent,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。例如 GET 方法多次请求资源肯定是幂等的,但是 POST 就不一定,POST 可能在请求装载数据发送到服务器,来修改数据库的数据。
可缓存:部分 HTTP 请求方法在请求资源后会自动缓存资源,以节省新的请求耗费的网络资源,并且加快网页响应。这种缓存可以通过Cache-Control
等请求头参数来控制。
方法 | 请求有请求体 | 是否有响应体 | 是否安全 | 是否幂等 | 是否可缓存 |
---|---|---|---|---|---|
GET | 否 | 是 | 是 | 是 | 是 |
HEAD | 否 | 否 | 是 | 是 | 是 |
POST | 是 | 是 | 否 | 否 | 否 |
PUT | 是 | 否 | 否 | 是 | 否 |
DELETE | 可能有 | 可能有 | 否 | 是 | 否 |
CONNECT | 否 | 是 | 否 | 否 | 否 |
OPTIONS | 否 | 是 | 是 | 是 | 否 |
TRACE | 否 | 否 | 否 | 是 | 否 |
PATCH | 是 | 是 | 否 | 否 | 否 |
GET
GET
表示从服务器读取一个资源文件或者数据;在浏览器中,
GET
是加载所有资源的请求方法,也就是 HTML,CSS,JS,还有图片,视频等媒体文件,都是通过GET
请求获取。GET
没有请求体,参数只能通过 URL 的 queryString 部分串接起来,由于 URL 只能使用 ASCII 字符集,其他字符都会被进行百分比编码,这使得GET
也只支持 UTF-8 编码;GET
不支持文件上传;HTML 的表单默认是通过
GET
请求方式进行提交;GET
请求结果默认会被浏览器缓存下来
POST
根据 rfc 的规范来看,POST
请求方法主要用于向服务端提交新数据并根据提交的数据创建新的资源,如果资源被创建成功,服务端应该返回201 Created
响应状态码,并在Location
头部字段中包含新资源的链接,从而浏览器在收到响应后会请求新资源,并跳转页面。
POST
请求结果一般不能被缓存,因为涉及到服务器数据修改;- 如果是 HTML 的原生表单提交数据,当指定
POST
作为提交方法时,浏览器会根据表单的name
属性和客户填入的信息使用百分比编码application/x-www-form-urlencoded
的键值对形式放在请求体中,形如key1=value1&key2=value2
- 当然
POST
也支持其他编码格式来提交数据,例如文件上传等; - 如果通过
POST
新建数据,服务端应该返回201
状态码表示创建数据成功,同时在响应头部添加Location
字段表示新数据的 URL,浏览器在收到响应后可以选择使用GET
请求新资源也可以做其他动作; - 如果客户端希望缓存
POST
请求响应后的结果,而在下次GET
请求中重用,则服务端应该返回200
状态码和Content-Location
头部字段,Content-Location
的值应和发起请求时的 URL 相同; - 如果
POST
请求创建的新数据已经存在,服务端应该返回303
状态码,以及Location
头部字段提供已存在数据的 URL,浏览器可以通过GET
来重定向请求已存在的数据
HEAD
HEAD
只请求服务端返回的响应头信息,因此服务端返回的 HTTP 报文中不应该带有响应体,如果有的话也会被忽略掉。
HEAD
和GET
区别就是GET
发起的请求可以有响应体,HEAD
经常被用作在发送GET
请求前决定是否使用大量带宽来下载资源,例如响应头中携带的Content-Length
信息表示要下载的资源文件的大小。
PUT
PUT
表示新建或者覆盖数据。
PUT
通过请求体发送数据,如果服务器上没有该数据则新建数据,并返回201
响应状态码;- 如果服务器上有该数据,服务端会根据
PUT
发送的请求体来覆盖该数据,并返回204
或者200
来表示更新资源
DELETE
DELETE
一看就是为了删除数据的请求,如果服务器成功删除数据,可能会返回以下状态码:
200
:OK,表示服务器已经执行删除操作,并且返回的报文包含响应体,描述执行操作的结果信息。202
:Accepted,表示服务器接收请求并准备删除数据,但是还没执行;不包含响应体。204
:No Content,表示服务器已经执行删除操作,不包含响应体。
如果DELETE
一个资源不存在,从DELETE
幂等的角度看,每次执行DELETE
结果应该一致,那么应该返回上述状态码之一的204
;但是从服务端角度考虑,DELETE
的资源不存在,应该返回404
,具体如何实现看团队评估了。
OPTIONS
OPTIONS
主要是为了获取服务端支持的请求方法,或者在 CORS 中执行预检请求。
- 使用
OPTIONS
获取 URL 地址服务器所支持的 HTTP 请求方法,服务端在收到后会在响应头部添加Allow
参数; - 在 CORS 发起正式请求前,浏览器会先通过
OPTIONS
执行预检请求来获取服务端是否允许该请求。
PATCH
PATCH
就是补丁的意思,表示更新数据,PATCH
和PUT
什么区别:
PUT
是对数据进行完全覆盖;PATCH
只是对数据的一部分进行更新,类似于 SQL 的update
操作
TRACE
TRACE
执行环回测试,最后收到请求的服务端需要反馈Content-Type: message/http
以及200
的响应状态码。
CONNECT
CONNECT
请求方法会建立客户端和服务端通信的隧道,如果建立成功,可以支持双向通信。
CONNECT
仅用于请求代理服务器;CONNECT
请求必须指定目标服务器的主机和端口号,而服务端必须限制允许请求的端口,否则将会带来安全问题;- 任何
2xx
系列的响应都表示CONNECT
建立成功; - 服务端响应不能包含
Transfer-Encoding
以及Content-Length
头部参数