[TOC]

HTTP 请求方法和状态码

HTTP定义了一组请求方法,以表明要给定资源执行的操作。指示针对给定资源要执行的期望动作。每个请求方法都实现了不同的语义,但一些共同的特征由一组共享,例如一个请求方法可以是安全幂等可缓存

  • 安全

    安全是指一个HTTP方法不会修改服务器的数据。也就是说,这是一个对服务器只读操作的方法。GETHEADOPTIONS是安全的,POSTPUTDELETE则不是安全的。

  • 幂等

    幂等是指一个HTTP方法同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。也就是说,幂等方法不应该具有副作用(统计用途除外)。GETHEADPUTDELETE等方法都是幂等的,而POST方法不是。所有安全方法也都是幂等的。

  • 可缓存

    可缓存响应是指,HTTP响应可以被缓存,响应被存储以供后面检索和使用,从而不需要从服务器从新获取。并不是所有HTTP响应都能被缓存,缓存HTTP响应有一下约束:

    • 请求方法本身是可缓存的,如GETHEAD方法。如果设置了缓存字段并设置了Content-Location头,则也可以缓存POSTPATCH响应,但很少实现,(例如,Firefox不支持它,)
    • 响应的状态代码由应用程序缓存知道,并且它被视为可缓存的。以下状态代码是可缓存的:200、203、204、206、300、301、404、405、410、414 和 501。
    • 响应头中没有指定缓存的头部,如Cache-Control,它可以阻止缓存。

    ***注意:***对特定的URI的某些不可缓存的请求/响应可能会使以前缓存的响应失效。例如PUT到pageX.html页面,将使相同URI下所有的GET或HEAD请求缓存失效。

请求方法出现的时间:

  • HTTP/0.9: GET
  • HTTP/1.0: POST、HEAD
  • HTTP/1.1: OPTIONS、PUT、DELETE、TRACE、CONNECT

1. 请求方法说明:get、post、option.....

方法 说明
GET 请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.
HEAD 请求一个与GET请求的响应相同的响应,但没有响应体.HEAD方法作用:1、在不获取资源的情况下获取资源信息(类型、大小等)。2、通过状态码查看资源是否存在。3、通过查看首部,测试资源是否被修改了。
POST 向指定资源提交数据,请求服务器对数据进行相应处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。
PUT 向服务器写入资源,请求服务器创建一个新的目标资源,或者替换原先的目标资源。
OPTIONS 该请求返回服务器对指定资源支持哪些 HTTP 请求方法。
DELETE 用于删除指定的资源。和PUT一样,服务器可能会不支持。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
PATCH 用于对资源进行部分修改。由于PATCH不是标准的HTTP方法,所以不能保证客户端和服务端都已经实现。

注意:

根据RFC2616,HTTP 方法是区分大小写的,而Header是不区分的。

当指定资源不支持对应请求方法时,服务器返回状态码405(Method Not Allowed)。

当服务器不认识或者不支持对应请求方法时,服务器返回状态码501(Not Implemented)。

2. 关于请求方法的说明、区别

2.1 GET和POST区别

GET 和 POST 到底有什么区别?知乎

W3school给的标准答案:

GET POST
浏览器后退/刷新 按钮 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
书签 可以收藏为书签 不能收藏为书签
缓存 可以被缓存 不能被缓存
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
历史记录 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
数据长度限制 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
对数据类型的限制 只允许 ASCII 字符。 没有限制。也允许二进制数据。
安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。

从标准上来看,GET 和 POST 的区别如下:

  • GET 用于获取信息,是无副作用的,是幂等的,且可缓存
  • POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存

2.1.1 POST 方法比 GET 方法安全?

以下几点POST确实比GET安全一点:

  • GET方法容易被浏览器缓存
  • 在浏览器的历史记录中会保留请求的地址
  • 使用GET提交数据还可能会造成Cross-site request forgery攻击

上述内容只是浅显的解释,对于真正意义上的安全没有任何作用。然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。

要想安全传输,就只有加密,也就是 HTTPS。

2.1.2 GET、POST与请求数据如何传递没有关系

GET、POST是由HTTP协议定义的。HTTP协议中没有定义:GET请求的数据要放在URL中,POST请求的数据放在BODY中。是HTML标准对GET、POST进行了以上约定。现在web server大都是支持GET中包含body这样的请求。

我们可以在GET请求中通过body传递参数,但是需要后端服务进行相应的解析,在复杂的网络环境中需要考虑中转服务器、代理服务器对body数据的处理,避免参数丢失。

2.1.3 POST产生两个TCP数据包?

有些文章中提到,post 会将 header 和 body 分开发送,先发送 header,服务端返回 100 状态码再发送 body。

HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,而且实际测试(Chrome)发现,header 和 body 不会分开发送。

所以,header 和 body 分开发送是部分浏览器或框架的请求方法,不属于 post 必然行为。

2.2 PUT、POST区别

put和post的技术实现上应该是没有很大区别的。但在于协议上语义是很大区别。

PUT方法是幂等的:连续调用一次或者多次的效果相同(无副作用),而POST方法是非幂等的。

除此之外还有一个区别,通常情况下,PUT的URI指向是具体单一资源,而POST可以指向资源集合。

举个例子,我们在开发一个博客系统,当我们要创建一篇文章的时候往往用POST https://www.jianshu.com/articles,这个请求的语义是,在articles的资源集合下创建一篇新的文章,如果我们多次提交这个请求会创建多个文章,这是非幂等的。

PUT https://www.jianshu.com/articles/820357430的语义是更新对应文章下的资源(比如修改作者名称等),这个URI指向的就是单一资源,而且是幂等的,比如你把『刘德华』修改成『蔡徐坤』,提交多少次都是修改成『蔡徐坤』

2.3 PUT、PATCH区别

PUT和PATCH都是更新资源,而PATCH用来对已知资源进行局部更新。

3. HTTP状态码

HTTP状态码(英语:HTTP Status Code)用来表示请求的结果,状态码被分为五大类:

  1. 100-199 信息,服务器收到请求,需要请求者继续执行操作。
    • 100 (Continue):请求已被服务器接收,客户端应继续发送请求的其余部分。
    • 101 (Switching Protocols):服务器理解了客户端的请求,并将根据请求切换协议
  2. 200-299 表示请求成功,操作被成功接收并处理。
    • 200 OK:请求已成功,且响应主体包含请求的资源
    • 201 Created:请求已完成并导致了新资源的创建
    • 202 Accepted:请求已被接受进行处理,但处理尚未完成
    • 204 No Content:请求已成功处理,但没有内容返回
    • 206 Partial Content:服务器已经执行了部分GET请求
  3. 300-399 重定向,需要进一步的操作以完成请求。
    • 301 Moved Permanently:永久重定向,新的URL在Location头中给出,浏览器应该自动地访问新的URL
    • 302 Found:临时重定向
    • 303 See Other: 临时重定向
    • 304 Not Modified:未修改,使用缓存
    • 305 Use Proxy:使用代理
    • 307 Temporary Redirect:临时重定向
  4. 400-499 表示浏览器方面出错。
    • 400 Bad Request:客户端请求的语法错误,服务器无法理解。
    • 401 Unauthorized:请求需要用户验证。
    • 403 Forbidden:服务器理解请求但拒绝执行,无权限操作。
    • 404 Not Found:服务器无法找到请求的资源。
    • 405 Method Not Allowed:请求行中指定的请求方法不能被用于请求相应的资源。
    • 406 Not Acceptable:服务器无法生成响应Accept头部列表中所接受的内容。
    • 407 Proxy Authentication Required:请求需要代理身份验证。
    • 408 Request Timeout:客户端请求超时。
    • 409 Conflict:请求因冲突而失败。
    • 410 Gone:请求的资源不再可用。
  5. 500-599 表示服务器方面出错
    • 500 Internal Server Error:服务器遇到了不知如何处理的情况,通常是服务器上的程序代码出错。
    • 501 Not Implemented:请求的功能服务器不支持,例如服务器不支持请求方法时可能会出现这个状态码。
    • 502 Bad Gateway:服务器作为网关或代理时收到了无效的响应。
    • 503 Service Unavailable:服务器暂时无法处理请求,可能是因为超载或停机维护。
    • 504 Gateway Timeout:服务器作为网关或代理,但是没有在允许的时间内从上游服务器收到请求。
    • 505 HTTP Version Not Supported:服务器不支持请求中所指明的HTTP版本。
状态代码 状态信息 含义
100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)
101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)
200 OK 一切正常,对GET和POST请求的应答文档跟在后面。
201 Created 服务器已经创建了文档,Location头给出了它的URL。
202 Accepted 已经接受请求,但处理尚未完成。
203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。
204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。
206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器 返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。
303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告 诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
307 Temporary Redirect 和302 (Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定 向。由于这个原因,HTTP 1.1新增了307,以便更加清楚的区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向。(HTTP 1.1新)
400 Bad Request 客户端请求的语法错误,服务器无法理解。
401 Unauthorized 请求需要用户验证。客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填 写合适的Authorization头后再次发出请求。
403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。
405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)
406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。
407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)
408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)
409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)
410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而 404表示由于未知的原因文档不可用。(HTTP 1.1新)
411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)
412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。
413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。
414 Request URI Too Long URI太长(HTTP 1.1新)。
416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)
500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个 Retry-After头。
504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)
505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

参考资料

HTTP 请求方法 MDN

HTTP协议漫谈 - HTTP协议请求方法

99%的人理解错 HTTP 中 GET 与 POST 的区别

HTTP状态码 菜鸟教程

Last Updated: 9/9/2024, 4:23:16 PM