跳到主要内容

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只请求服务端返回的响应头信息,因此服务端返回的 HTTP 报文中不应该带有响应体,如果有的话也会被忽略掉。

HEADGET区别就是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就是补丁的意思,表示更新数据,PATCHPUT什么区别:

  • PUT是对数据进行完全覆盖;
  • PATCH只是对数据的一部分进行更新,类似于 SQL 的update操作

TRACE

TRACE执行环回测试,最后收到请求的服务端需要反馈Content-Type: message/http以及200的响应状态码。

CONNECT

CONNECT请求方法会建立客户端和服务端通信的隧道,如果建立成功,可以支持双向通信。

  • CONNECT仅用于请求代理服务器;
  • CONNECT请求必须指定目标服务器的主机和端口号,而服务端必须限制允许请求的端口,否则将会带来安全问题;
  • 任何2xx系列的响应都表示CONNECT建立成功;
  • 服务端响应不能包含Transfer-Encoding以及Content-Length头部参数