超文本传输协议(HTTP,Hypertext Transfer Protocol )是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端—服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。
在客户端与服务端之间,还有许多的被称为代理(Proxy)的实体,履行不同的作用:
由请求(响应)起始行 + 请求(响应)头部 + 空行(区分头部与实体) + 实体(body)构成。其中请求(响应)起始行分别为方法 + URI路径 + HTTP版本 (版本 + 状态码 + 原因Reason):
空行之前不能存在空行的原因:多余的空行会导致空行后的内容全部被视为实体。
首部字段的格式特点:字段名不区分大小写、不允许出现空格,不可以出现下划线 _、字段名后必紧跟着冒号(:)。
HTTP 1.0默认短连接(一个请求对应一个TCP连接),HTTP 1.1默认长连接(一个TCP连接可发多个请求,因此可管道传输—当前请求响应前可继续发送下一请求):减少了重复建立和断开 TCP 连接所造成的额外开销,减轻了服务器端的负载,减少整体的响应时间。
简单易理解(优点):报文格式就是 header + body,头部信息也是 key-value 简单文本的形式。
灵活易扩展(优点):语义自由(除基本格式外没严格语法限制),传输形式多样(文本、图片、视频等)、工作在应用层,下层可随意变化(HTTPS增加SSL/TLS 安全传输层,HTTP/3 甚至TCP替换成基于 UDP 的 QUIC)。
明文传输:报文(主要是头部)使用文本形式,调试便利(优点), 但也暴露给攻击者(缺点)。
无状态:不需要保存连接上下文信息场景(优点),长连接的场景下(缺点)。
HTPP 1.1存在队头阻塞(缺点):开启长连接,虽然可以不等响应发起新请求,但需要按顺序响应请求,前面的请求没响应之前会产生阻塞。
不安全(缺点):不验证通信方的身份,无法证明报文的完整性、通信明文(不加密)。
(优点)跨平台、应用广泛,(缺点)请求单向性、无优先级控制、按顺序响应、首部冗长未压缩。
HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。响应被归为五大类:
1. 信息响应 (100–199):表示目前是协议处理的中间状态,还需要后续操作。
(1)100 Continue 继续。表示目前为止一切正常,客户端应该继续请求,如果已完成请求则忽略。要让服务器检查请求头,客户端必须在初始请求中发送Expect: 100-continue作为标头,并在发送body之前接收100 Continue状态代码的响应。
(2)101 Switching Protocols 切换协议。表示服务器切换到的协议,该协议在从客户端收到的Upgrade响应头中指定。只能切换到更高级的协议,例如,HTTP升级为WebSocket。
(3)102 Processing 正在处理。向客户端指示已收到完整请求并且服务器正在处理该请求。仅当服务器预计请求需要很长时间时才发送,它告诉客户端请求尚未终止。已弃用,不应再发送,客户可能仍接受它,但会忽略。
(4)103 Early Hints 早期提示。由服务器仍在准备响应时发送,并提示客户端服务器期望最终响应将链接的资源。这允许浏览器甚至在服务器准备并发送最终响应之前就开始预加载资源。主要与指示要加载的资源的Link标头一起使用,也还可能包含处理早期提示时强制执行的 Content-Security-Policy 标头(比如,早期响应通过将CSP设置为”self”限制为与请求相同的源才预加载资源。虽然最终响应可能会将 CSP 设置为无,即资源已被预加载,但不会被使用)。服务器可能会在重定向后发送多个 103 响应。浏览器只处理第一个早期提示响应,如果请求导致跨源重定向,则必须丢弃该响应。来自早期提示的预加载资源会有效地预加载到文档的head元素中,然后才是最终响应中加载的资源。出于兼容性考虑(Chrome103+/Firefox102+且需要用户主动启用/Edge103+,且支持范围限制在 HTTP/2 或更高版本),除非已知客户端能正确处理该响应,建议只通过 HTTP/2 或更高版本发送早期提示响应。
2. 成功响应 (200–299):表示成功状态。
(1)200 OK 成功。表明请求已经成功。默认情况下状态码为 200 的响应可以被缓存。成功的含义取决于HTTP请求方法:
① GET: 资源已被获取并在消息体中传输。
② HEAD: 表示标头包含在响应中,没有任何消息正文(body)。
③ POST: 资源已被获取并在消息体中传输。
④ TRACE: 响应的消息体中包含服务器接收到的请求信息。
⑤PUT 和 DELETE 的请求成功通常并不是响应200 OK而是204 No Content (或者201 Created)。
(2)201 Created 表示请求已经被成功处理,并且创建了新的资源。新的资源在应答返回之前已经被创建。同时新增的资源会在应答消息体中返回,其地址或者是原始请求的路径,或者是 Location 首部的值。常规使用场景是作为 POST 请求的结果。
(3)202 Accepted 已接受。表示请求已被接受处理,但处理尚未完成;事实上,处理可能还没有开始。该请求最终可能会或可能不会被执行,因为在实际处理时可能会拒绝该请求。它是非承诺性的,即HTTP无法在稍后发送异步响应,说明处理请求的结果。它适用于另一个进程或服务器处理请求或批处理的情况。
(4)203 Non-Authoritative Information 非授权信息。表明请求已成功,但转换代理已根据源服务器的 200 (OK) 响应修改了随附的有效负载。它类似于 Warning 首部的 214(Transformation Applied)警告码,后者的优势在于可以应用于任何状态码的响应之中。
(5)204 No Content 无内容。表示请求已成功,但客户端不需要离开其当前页面。默认情况下 204 响应是可缓存的(此类响应中包含 ETag 标头)。适用于PUT和DELET请求。例如,在 PUT 请求中进行资源更新,但是不需要改变当前展示给用户的页面,那么返回 204 No Content;如果创建了资源,则返回 201 Created;如果应将页面更改为新更新的页面,则应改用 200。虽然此状态代码旨在描述无body的响应,但服务器可能会错误地将数据包含在标头之后。该协议允许用户代理以不同方式处理此类响应,在持久连接中是可以观察到的,其中无效body可能包括对后续请求的不同响应。 Safari拒绝任何此类数据。Chrome和Edge在有效响应之前最多丢弃四个无效字节。Firefox在有效响应之前可以容忍超过 1 KB 的无效数据。
(6)205 Reset Content 重置内容。告诉客户端重置文档视图,例如清除表单的内容、重置canvas状态或刷新 UI。如果此响应错误地包含持久连接上的body,不同浏览器的处理行为与204同。
(7)206 Partial Content 部分内容。表示请求已成功,并且body中包含请求中Range首部指定的数据范围结果。如果只包含一个数据区间,那么整个响应的Content-Type首部的值为所请求的文件的类型,同时包含Content-Range首部;如果包含多个数据区间,那么整个响应的Content-Type首部的值为multipart/byteranges,每个片段覆盖一个数据区间并用Content-Range 和 Content-Type 进行描述。使用场景为 HTTP 分块下载和断点续传。
(8)207 Multi-Status 多状态。响应体是带有多状态根元素的文本/xml 或应用程序/xml HTTP 实体。XML body将列出所有单独的响应代码。返回资源集合的能力是 WebDAV 协议的一部分(它可以由访问 WebDAV 服务器的 Web 应用程序接收)。访问网页的浏览器永远不会遇到此状态代码。
(9)208 Already Reported 已报告。用于207响应中,以节省空间并避免冲突。如果以不同的路径多次请求同一资源(例如作为集合的一部分),则只有第一个资源会报告 200。所有其他绑定的响应将报告此 208 状态代码,因此不会产生冲突,并且响应保持较短。将资源绑定到多个路径的能力是 WebDAV 协议的扩展(它可以由访问 WebDAV 服务器的 Web 应用程序接收)。访问网页的浏览器永远不会遇到此状态代码。
(10)226 IM Used 已使用IM。在增量编码的上下文中由服务器设置以指示它正在返回其收到的GET请求的增量。浏览器不支持 HTTP 增量编码(delta encoding),此状态代码由特定客户端使用的自定义服务器发回。使用增量编码时,服务器会用相对于给定基础文档(而不是当前文档)的差异(称为deltas)来响应GET请求。客户端使用 HTTP标头A-IM表示要使用哪种差异算法,并使用If-None-Match标头提示服务器它得到的最新版本。服务器会生成一个delta,并在包含 IM标头(使用的算法名称)和 Delta-Base标头(与 delta 相关联的基础文档的 ETag)的226响应中发送回来。
3.重定向消息 (300–399):重定向状态,资源位置发生变动,需要重新请求。
(1)300 Multiple Choices 多选择。表示该请求有多个可能的响应。用户代理或用户应该选择其中之一,但由于没有如何选择的标准方法,因此该状态码很少使用。如果服务器有首选选择,它应该生成 Location 标头。
(2)301 Moved Permanently永久重定向。表示请求的资源已明确移动到 Location 标头给出的 URL。浏览器会重定向到新的 URL,搜索引擎也会更新其资源链接。虽然规范要求在执行重定向时method和body保持不变,但并非所有用户代理都符合。由于该状态明确禁止更改方法,请仅将 301 用作 GET 或 HEAD 方法的响应,而将 308 用于 POST 方法。比如,http永久重定向到https(会做缓存优化)。
(3)302 Found 临时重定向。表明请求的资源被暂时的移动到了由Location 指定的 URL 上,客户端应继续使用原有URI。不会做缓存优化,浏览器会重定向到这个 URL,但是搜索引擎不会对该资源的链接进行更新 (用 "搜索引擎优化术语 "来说,就是 "链接汁液 "不会被发送到新的 URL 上)。即使规范要求浏览器在重定向时保证请求method和请求body不变,但并不是所有的用户代理都会遵循。由于该状态明确禁止更改方法,所以推荐仅将 302 用作 GET 或 HEAD 方法的响应,而在其他时候使用307来替代。在确实需要将重定向请求的方法转换为 GET的场景下,可以使用 303,比如在使用 PUT 方法进行文件上传操作时,需要返回确认信息(例如“你已经成功上传了 xyz”)而不是上传的资源本身。
(4)303 See Other 参阅其他。表示重定向不链接到所请求的资源本身,而是链接到另一个页面(例如确认页面,或上传进度页面)。它通常作为 PUT 或 POST 的结果发回。用于显示此重定向页面的方法始终是 GET。
(5)304 Not Modified 未修改(缓存重定向)。表示无需重传所请求的资源。这是对缓存资源的隐式重定向,缓存控制中当协商缓存命中时(即客户端提供一个头信息指出客户端希望只返回在指定日期之后修改的资源)会返回。当请求方法是安全方法(例如 GET 或 HEAD)时,或者当请求是有条件的并使用 If-None-Match 或 If-Modified-Since 标头时会发生。响应不得包含body,并且必须包含在等效 200 OK 响应中发送的标头:Cache-Control、Content-Location、Date、ETag、Expires 和 Vary。许多开发工具的浏览器网络面板都会创建导致 304 响应的无关请求,因此开发人员可以看到对本地缓存的访问。(6)如果此响应错误地包含持久连接上的body,不同浏览器的处理行为与204同。
(6)307 Temporary Redirect 临时重定向。表示请求的资源已暂时移动到 Location 标头给出的 URL。原始请求的method和body将被重新用于执行重定向请求。如果希望使用的方法改为 GET,请使用 303 代替。307和302唯一的区别是307保证重定向请求时方法和主体不会改变。对于 302,一些旧客户端错误地将方法更改为 GET:使用非 GET 方法和 302 的行为在 Web 上是不可预测的,而使用 307 的行为是可预测的。对于 GET 请求,它们的行为是相同的。
(7)308 Permanent Redirect 永久重定向。表示请求的资源已明确移动到 Location 标头给出的 URL。浏览器重定向到此页面,搜索引擎更新其到该资源的链接。请求method和body不会改变,而 301 有时可能会错误地更改为 GET 方法。某些 Web 应用程序可能会以非标准方式或出于其他目的使用 308 Permanent Redirect。例如,Google Drive 使用 308 Resume Incomplete 响应来向客户端指示不完整的上传何时停止。
4. 客户端错误响应 (400–499):请求报文有误。
(1)400 Bad Request 表示服务器因某些被认为是客户端错误的原因(例如,请求语法错误、无效请求消息格式或者欺骗性请求路由),而无法或不会处理该请求。警告: 客户端不应该在未进行修改的情况下重复发送此请求。
(2)401 Unauthorized 未授权。表示客户端请求尚未完成,因为它缺少所请求资源的有效身份验证凭据。会与包含有如何进行验证的信息的WWW-Authenticate 首部一起发送。该状态码类似于 403 Forbidden,区别是依然可以进行身份验证。
(3)402 Payment Required 需要付款。被创建最初目的是用于数字现金或微型支付系统,表明客户端请求的内容只有付费之后才能获取。目前还不存在标准的使用约定,不同的实体可以在不同的环境下使用。是一个非标准响应状态码,该状态码被保留但未定义,实际上没有浏览器支持它。
(4)403 Forbidden 禁止。表示服务器理解该请求但拒绝授权。类似于 401,但进入 403状态后即使重新验证也不会改变该状态。该访问是长期禁止的,并且与应用逻辑密切相关(例如没有足够的权限访问该资源)。
(5)404 Not Found 找不到。表示服务器无法找到请求的资源。指向 404 页面的链接通常被称为断链或死链。404 只表示资源丢失,而不表示是暂时还是永久丢失。如果资源被永久删除,请使用 410。可以显示自定义 404 页面,以便为用户提供更多帮助,并提供下一步操作的指导。例如,对于 Apache 服务器,可以在 .htaccess 文件中指定自定义 404 页面的路径(定制设计是好事,但要适度。可以使404 页面变得幽默且人性化,但不要让用户感到困惑。)
(6)405 Method Not Allowed 方法不允许。表示服务器知道请求方法,但目标资源不支持此方法。服务器必须在 405 中生成一个Allow标头。该字段必须包含目标资源当前支持的方法列表。
(7)406 Not Acceptable 不可接受的。表示服务器无法生成与请求中的主动内容协商标头(Accept、Accept-Encoding、Accept-Language)中定义的可接受值列表相匹配的响应,并且服务器不愿意提供默认表示。实际上,这个错误很少被使用。服务器不会使用此错误代码进行响应(这对于最终用户来说是神秘的且难以修复),而是忽略相关标头并向用户提供实际页面。如果服务器返回此状态码,则消息body应包含资源的可用表示形式的列表,允许用户在其中进行选择。
(8)407 Proxy Authentication Required 需要代理授权。由于缺乏位于浏览器与可以访问所请求资源的服务器之间的代理服务器(proxy server )要求的身份验证凭证,发送的请求尚未得到满足。会与包含有如何进行验证的信息的Proxy-Authenticate 首部一起发送。
(9)408 Request Timeout 请求超时。表示服务器想要关闭这个未使用的连接。即使客户端之前没有任何请求,它也会由某些服务器在空闲连接上发送。服务器应该在响应中发送“close”Connection 标头字段,因为 408 意味着服务器已决定关闭连接而不是继续等待。由于某些浏览器(例如 Chrome、Firefox 27+ 和 IE9)使用 HTTP 预连接机制来加快网络速度,因此该响应的使用更加频繁。有些服务器只是关闭连接而不发送此消息。
(10)409 Conflict 冲突。表示请求与目标资源的当前状态发生冲突。在响应 PUT 请求时最有可能发生冲突。例如,在上传比服务器上现有文件更旧的文件时,可能会收到 409,从而导致版本控制冲突。
(11)410 Gone 消失。表示源服务器不再提供对目标资源的访问,并且这种情况可能是永久性的。如果不知道这种情况是暂时的还是永久的,则应使用 404。410 默认是可缓存的。
(12)411 Length Required 表示服务器拒绝接受没有定义 Content-Length 标头的请求。根据规范,当使用分块模式传输数据时,Content-Length 头信息会被省略,需要在每个数据块的开头以十六进制格式添加当前数据块的长度。
(13)412 Precondition Failed前提条件失败。表示对目标资源的访问已被拒绝。当不满足 If-Unmodified-Since 或 If-None-Match 标头定义的条件时,除 GET 或 HEAD 之外的方法上的条件请求会发生这种情况,请求(通常是上传或修改资源)将无法执行,从而返回该错误状态码。
(14)413 Content Too Large 内容过大。表示请求实体大于服务器定义的限制;服务器可能会关闭连接或返回 Retry-After 标头。在 RFC 9110 之前,状态的响应短语是 Payload Too Large,此名字至今仍被广泛使用。
(15)414 URI Too Long。表示客户端请求的 URI 比服务器愿意解释的长度长。客户端不恰当地将 POST 请求转换为带有较长查询信息的 GET 请求、客户端陷入重定向循环(例如,重定向 URI 前缀指向自身的后缀)、或当服务器受到试图利用潜在安全漏洞的客户端攻击时会出现此情况。
(16)415 Unsupported Media Type 不支持的媒体类型。表示服务器拒绝接受请求,因为有效载荷格式是不支持的格式。格式问题的出现有可能源于客户端在 Content-Type 或 Content-Encoding 首部中指定的格式,也可能源于直接对负载数据进行检测的结果。
(17)416 Range Not Satisfiable 范围不满足。表示服务器无法为请求的范围提供服务。最可能的原因是文档不包含此类范围,或者 Range 标头值虽然语法正确,但没有意义。416 响应报文包含一个 Content-Range 首部,提示无法满足的数据区间(用星号 * 表示),后面紧跟着一个“/”,再后面是当前资源的长度。例如:Content-Range: */12777。面对此错误,浏览器通常要么中止操作(例如,下载将被视为不可恢复),要么再次请求整个文档。
(18)417 Expectation Failed 不满足期望。表示无法满足请求的 Expect 标头中给出的期望。
(19)418 I'm a teapot 我是一个茶壶。表示服务器拒绝冲泡咖啡,因为它永远是茶壶。暂时没有咖啡壶/茶壶的组合应该返回 503。此错误引用了 1998 年和 2014 年愚人节笑话中定义的超文本咖啡壶控制协议。一些网站使用此响应来处理不希望处理的请求,例如自动查询。
(20)421 Misdirected Request 表示请求被定向到无法生成响应的服务器。如果重用连接或选择替代服务时可能出现此情况。
(21)422 Unprocessable Content 表示服务器了解请求实体的内容类型,并且请求实体的语法正确,但无法处理所包含的指令。警告:客户端不应在未经修改的情况下重复此请求。
(22)423 Locked 表示暂定目标的资源已被锁定,即无法访问。其内容应包含一些 WebDAV XML 格式的信息。锁定资源的功能特定于某些 WebDAV 服务器。浏览器访问网页永远不会遇到这个状态码;如果发生错误,它们会将其作为通用 400 状态码进行处理。
(23)424 Failed Dependency 表示无法对资源执行该方法,因为请求的操作依赖于另一个操作,并且该操作失败。常规 Web 服务器通常不会返回此状态代码。但其他一些协议(例如 WebDAV)可以返回它。例如,在 WebDAV 中,如果发出 PROPPATCH 请求,并且一个命令失败,则所有其他命令也会自动失败,并显示 424 Failed Dependency。
(24)425 Too Early 表示服务器不愿意冒险处理可能重播的请求,这会产生重播攻击的可能性。
(25)426 Upgrade required 表示服务器拒绝使用当前协议执行请求,但在客户端升级到不同协议后可以接受。服务器会在响应中使用 Upgrade 首部来指定要求的协议。
(26)428 Precondition required 表示服务器要求发送条件请求。通常,这意味着缺少必需的条件首部,例如 If-Match。而当一个条件首部的值不能匹配服务器端的状态的时,应答的状态码应该是 412 Precondition Failed,前置条件验证失败。
(27)429 Too Many Requests 表示用户在给定时间内发送了太多请求(“速率限制”)。此响应中可能包含 Retry-After 标头,指示在发出新请求之前需要等待多长时间。
(28)431 Request Header Fields Too Large 表示服务器拒绝处理该请求,因为请求的 HTTP 标头太长。减少请求标头的大小后可以重新提交请求。当请求头的总大小太大,或者单个头字段太大时,可以使用431。为帮助用户解决问题,应在响应body中指出这两个错误中的哪一个是问题所在且包括哪些标头太大。引用 URL 太长或请求中发送的 Cookie 太多时服务器通常会使用此状态码。
(29)451 Unavailable For Legal Reasons 表示用户请求的资源由于法律原因不可用,例如已发出法律诉讼的网页。
5. 服务端错误响应 (500–599):服务器端发生错误。
(1)500 Internal Server Error 表示服务器遇到了意外情况,导致其无法完成请求。这个错误代码是一个通用的“万能”响应代码。有时候,对于类似于 500 这样的错误,服务器管理员会更加详细地记录相关的请求信息来防止以后同样错误的出现。
(2)501 Not Implemented 表示服务器不支持完成请求所需的功能。此状态还可以发送 Retry-After 标头,告诉请求者何时检查以查看届时是否支持该功能。当服务器无法识别请求方法并且无法支持任何资源时,501 是恰当的响应。服务器唯一必须支持的方法是 GET 和 HEAD,因此不得返回 501。如果服务器确实能识别该方法,但故意不支持它,则适当的响应是 405 方法不允许。默认情况下,501 响应是可缓存的。501 错误需要所尝试访问的网络服务器来进行修复。
(3)502 Bad Gateway 表示服务器在充当网关或代理时从上游服务器收到无效响应。网关可能指的是网络中的不同事物,502 错误通常无法修复,但需要 Web 服务器或尝试访问的代理进行修复。
(4)503 Service Unavailable 表示服务器尚未准备好处理请求。常见原因是服务器因维护而停机或过载。此响应应用于临时情况,并且 Retry-After HTTP 标头应(如果可能)包含服务恢复的估计时间以及解释问题的用户友好页面。应注意随此响应一起发送的与缓存相关的标头,因为503 通常是一种临时状态,响应通常不应被缓存。
(5)504 Gateway Timeout 表示服务器在充当网关或代理时,没有及时从上游服务器获得完成请求所需的响应。
(6)505 HTTP Version Not Supported 表示服务器不支持请求中使用的 HTTP 版本。
(7)506 Variant Also Negotiates 表示服务器内部配置错误,此时所选变体本身被配置为参与内容协商,因此不是一个合适的协商端点。可在透明内容协商(见 RFC 2295)中给出。在服务器支持多种变体的情况下,该协议使客户端能够检索给定资源的最佳变体。
(8)507 Insufficient Storage可以在 WebDAV 协议(基于 web 的分布式创作和版本控制,参见 RFC 4918)中给出。表示服务器不能存储相关内容。准确地说,一个方法可能没有被执行,因为服务器不能存储其表达形式,这里的表达形式指:方法所附带的数据,而且其请求必需已经发送成功。
(9)508 Loop Detected 表示服务器终止了操作,因为在处理“Depth: infinity”的请求时遇到无限循环。此状态表明整个操作失败。可以在 WebDAV 协议(基于 Web 的分布式创作和版本控制)中给出。
(10)510 Not Extended 在 HTTP 扩展框架协议(参见 RFC 2774)中发送。在 HTTP 扩展框架协议中,一个客户端可以发送一个包含扩展声明的请求,该声明描述了要使用的扩展。如果服务器接收到这样的请求,但是请求不支持任何所描述的扩展,那么服务器将使用 510 状态码进行响应。
(11)511 Network Authentication Required表示客户端需要通过验证才能使用该网络。该状态码不是由源头服务器生成的,而是由控制网络访问的拦截代理服务器生成的。网络运营商有时在授予访问权限之前需要进行一些身份验证、接受条款或其他用户交互(例如在网吧或机场)。他们经常使用媒体访问控制 (MAC,Media Access Control) 地址来识别尚未这样做的客户端。
在HTTP协议中,不同的请求方法只是包含不同的语义,但服务器和浏览器的一些约定俗成的行造 成了它们具体的区别。
幂等:指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。幂等方法不应该具有副作用(统计用途除外)。在正确实现的条件下, GET, HEAD、PUT、DELETE、OPTIONS和TRACE方法都是幂等的,而 POST、CONNECT和PATCH方法不是。所有的安全方法都是幂等的。幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同(例如,第一次调用 DELETE 方法有可能返回200 ,但是后续的请求由于已经删除可能会返回 404)。需要主义的是,服务器不一定会确保请求方法的幂等性,有些应用可能会错误地打破幂等性约束。
安全:指的是不会修改服务器数据,对服务器是只读操作。安不安全的定义是这个方法需不需要服务器修改数据。所有安全的方法都是幂等的,但并非所有幂等方法都是安全的,PUT和DELETE方法不是安全的。建议任何应用都不应让 GET 请求修改服务端的状态(数据)。安全的方法并不意味着只是对服务端的静态文件的请求,服务端可以在请求的时候即时生成资源返回,只要生成资源的脚本保证是安全的即可。
可缓存:指的是可以缓存的 HTTP 响应,它被存储起来以便后续的检索和使用,省去了对服务器的新的请求。对一些不可缓存的请求/响应可能会使先前缓存的响应失效,比如PUT 将使所有对同一 URI 的 GET 或 HEAD 的缓存请求失效。并非所有的 HTTP 响应都可以被缓存,需同时满足条件:
(1)请求中使用的方法本身就是可缓存的,即 GET 或 HEAD 方法。如果指示了有效期并且设置了 Content-Location 标头,POST 或 PATCH 请求的响应也可以被缓存,但是这很少被实现,比如Firefox 就不支持它。其他方法,如 PUT 或 DELETE 是不可缓存的,其结果也不能被缓存。
(2)响应的状态码对应用程序的缓存可知,且被认为是可缓存的。可缓存状态码有:200、203、204、206、300、301、404、405、410、414 和 501。
(3)响应中与缓存相关的特定标头,如 Cache-Control。
CONNECT 请求方法可以开启与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)。它是一个逐跳(hop-by-hop)的方法。请求与响应均无body、不安全、不幂等、不可缓存以及不允许在HTML表单中使用。客户端要求 HTTP 代理服务器将 TCP 连接作为通往目的主机的隧道,代理服务器会面向客户端发送或接收 TCP 数据流。它可以用来访问采用了 SSL(HTTPS)协议的站点。
DELETE 请求方法用于删除指定的资源。请求与响应均可能body、不安全、幂等、不可缓存以及不允许在HTML表单中使用。方法成功执行可能响应状态码为200(操作已执行且响应消息包含描述状态的表示)、202(操作可能会成功但尚未实施)或204(操作已执行且无需提供进一步信息)。
HEAD 请求方法请求资源的标头信息,并且这些标头与 GET方法请求时返回的一致。请求与响应均无body、安全、幂等、可缓存以及不允许在HTML表单中使用。一个使用场景是在下载大文件前先通过 HEAD 请求读取其 Content-Length 标头的值获取文件的大小,而无需实际下载文件,以此可以节约带宽资源。HEAD 方法的响应不应有body,如果有,则必须忽略:任何可能描述错误body的表示标头都被假定为描述类似 GET 请求将收到的响应。如果 HEAD 请求的响应表明缓存的URL响应已过期,那么即使没有发出 GET 请求,缓存副本也会失效。
OPTIONS 请求方法请求给定 URL 或服务器所允许的通信选项。客户端可以使用此方法指定 URL,或使用星号 (*) 来引用整个服务器。请求无body、响应有body、安全、幂等、不可缓存以及不允许在HTML表单中使用。200 OK 和 204 No Content 都是允许的状态码。使用场景:1. 检测服务器所支持的请求方法;2. 发起CORS 中的预检请求以检测实际请求是否可以被服务器所接受。
PATCH 请求方法用于对资源进行部分修改,类似于CURD(创建:Create,读取:Read,更新:Update,删除:Delete)中的更新。与PUT是一个资源的完整表述形成对比,PATCH 请求是一组关于如何修改资源的指令。请求无body,响应可能有body、不安全、不幂等、不可缓存以及不允许在HTML表单中使用。任何 2xx 状态码都代表成功的响应。服务器可以通过将其加入 Allow 或 Access-Control-Allow-Methods响应标头中的列表来宣告其支持PATCH方法或者Accept-Patch 标头的存在。
PUT 请求方法创建一个新的资源或用请求的有效载荷替换目标资源的表示。和post的区别在于PUT是幂等的。请求有body,响应可能有body、不安全、幂等、不可缓存以及不允许在HTML表单中使用。如果目标资源没有当前的表示,并且 PUT 方法成功创建了资源,那么源服务器必须返回 201(Created)来通知用户代理资源已创建。如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源服务器必须返回 200(OK)或 204(No Content)来表示请求成功完成。
TRACE 请求方法沿着通往目标资源的路径进行信息回环(loop-back)测试,提供了一种实用的 debug 机制。请求和响应均无body、安全、幂等、不可缓存以及不允许在HTML表单中使用。请求的最终接收者(源服务器或第一个在请求中收到 Max-Forwards 值为 0 的服务器)应将收到的信息作为 200(OK)响应的信息body反映给客户端,其 Content-Type 为 message/http。
GET请求方法请求指定资源的表示。使用 GET 的请求应该只用于请求数据,而不应该包含数据。请求无body,响应有body、安全、幂等、可缓存以及允许在HTML表单中使用。在 GET 请求中发送请求体或有效载荷可能会导致一些现有的实现拒绝该请求——虽然规范没有禁止,但语义没有定义,因此最好是避免在 GET 请求中发送有效载荷。
POST请求方法发送数据给服务器。请求主体的类型由 Content-Type 标头指定。请求和响应均有body、不安全、不幂等、仅在包含足够新的信息时可缓存以及允许在HTML表单中使用。POST 请求若是通过 HTML 表单发送,其内容类型(content type)是通过在