http状态码

状态码

如前文所示,http 状态码被分成了 5 大类,本节将详细阐述每一类。状态码为客户端提供了一种理解事物处理结果的便捷方式(尽管并没有实际的规范对原语短语的确切文本说明)

100~199 信息性状态码

  HTTP/1.1 向协议中引入了信息性状态码,这些状态码相对较新,由于对其复杂性存在一些争论而受到限制。

状态码 原因短语 含义
100Continue 说明收到了请求的初始部分,请客户端继续。发送了这个请求码后,服务器在收到请求之后必须进行响应
101Switching Protocols 说明服务器正在根据服务端的指定,将协议切换成 Update 首部所列的协议

  100 Continue 着实让人迷糊。它的目的是对如下的情况进行优化:HTTP 客户端应用程序有一个实体的主体部分要发送给服务器,但希望在发送之前查看一下服务器是否会接受这个实体。(很绕,会给 HTTP 程序员带来一些困惑,所以再这里我们要详细讨论一下它)

客户端与 100 Continue

  如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待 100 Continue 响应,那么客户端就要发送一个携带了值为 100 Continue 的 Expect 请求首部。如果客户端没有发送实体,就不应该发送 100 Continue Expect 首部,因为这样会使服务器误以为客户端要发送一个实体。

  从很多方面看,100 Continue 都是一种优化,客户端应用程序只有在避免向服务器发送一个服务器无法处理或使用的大实体时,才应该使用 100 Continue。由于起初对 100 Continue 状态存在一定困惑(在实践过程中也确实出现了问题),因此发送了值为 100 Continue 的 Expect 首部的客户端不应该永远在那儿等待服务器发送 100 Continue 响应。超过一定时间后,客户端应该直接将实体发送出去。

服务器与 100 Continue

  如果服务器收到了一条带有值为 100 Continue 的 Expect 首部的请求,它会用 100 Continue 响应或一条错误码来进行响应。服务器永远也不应该向没有发送 100 Continue Expect 的客户端发送 100 Continue 状态码(有些抽风了的服务器会这么做)

  如果出于某种原因服务器在发送 100 Continue 之前就收到了部分(或全部)的实体,就说明客户端已经决定继续发送数据了,这时候服务器就不需要发送这个状态码了。但服务器读完请求后,还是应该发送一个 最终状态码

  最后,如果服务器收到了带有 100 Continue 期望的请求,而且它决定在读取实体的主题部分之前(因为出错)结束请求,就不应该仅仅只是发送一条响应并关闭连接,因为这样会妨碍客户端接收响应

代理与 100 Continue

  如果代理从客户端收到了一条带有 100 Continue 期望的请求,它需要做一些事情:如果代理 知道或不知道 下一站服务器是 HTTP/1.1 兼容的,它都应该将 Expect 首部转发,如果它 知道下一站服务器只能与 HTTP/1.1 之前的版本兼容 ,就应该以 417 Expectation Failed 错误进行响应

200~299 成功状态码

  客户端发起请求时,这些 请求通常都是成功的 ,服务器有一组用来表示成功的状态码,分别对应于不同类型的请求。

状态码 原因短语 含义
200OK 实体的主体部分包含了全部的请求资源
201Created 用于创建服务器对象的请求
202Accepted 请求已被接受,但还未执行任何操作
203Non-Authoritative Information 实体首部包含的信息不是来自于源端服务器
204No Content 响应报文中包含若干行首部和一个状态行,但没有实体的主体部分
205Reset Content 主要告诉浏览器的代码,清除当前页面中的所有表单元素
206Partial Content 成功执行了一个部分或范围请求。(必须包含 Content-Range, 以及 ETag 或 Content-Location 首部)

300~399 重定向状态码

  重定向状态码要么告诉客户端使用替代位置来访问资源,要么就提供一个替代的响应的而不是资源的内容。如果资源已被移走,可发送一个重定向状态码和一个可选的 Location 首部来告知客户端资源已被移走,以及现在可以在哪里找到它。这样浏览器就可以再不打扰使用者的情况下,透明地转入新的位置了、

状态码 原因短语 含义
300Multiple Choices 客户端请求一个指向多个资源的 URL 时会返回这个状态码,比如 HTML 文档的中文和英文版本
301Moved Permanently 在请求的 URL 已被移除时使用,响应的 Location 首部中应该包含资源现在所处的 URL
302Found与 301 状态码类似,但是客户端应该使用 Location 首部给出的 URL 来临时定位资源,将来的请求仍然用原先的 URL
303See Other告知客户端应该以另一个 URL 来获取资源,新的 URL 位于响应报文的 Location 首部
304Not Modified 客户端可以通过所包含的请求首部,使其请求变成有条件的,带有这个状态码的响应不应该包含实体的主体部分
305Use Proxy 用来表明必须通过一个代理来访问资源,代理的位置由 Location 首部给出
306 暂未使用此状态码,保留。
307Temporary Redirect与 301 状态码类似,但客户端应该使用 Location 首部给出的 URL 来临时定位资源

  可以看出,302,303 和 307 之间存在一些交叉。这些状态码的用法的差别基本都源于 HTTP/1.0 和 HTTP/1.1 应用程序对这些状态码处理方式的不同。

  当 HTTP/1.0 客户端发起一个 POST 请求,并在响应中收到 302 重定向状态码时,它会接受 Location 首部的重定向 URL,并向这个 URL 发起一个 GET 请求(而不是原始请求中的 POST)

  HTTP/1.0 服务器和 HTTP/1.0 客户端之间的协议是:如果 HTTP/1.0 服务器收到了来自 HTTP/1.0 客户端的 POST 请求之后发送了 302 状态码,服务器就期望客户端能够接受重定向 URL,并向重定向的 URL 发送一个 GET 请求。

  到了 HTTP/1.1,问题有了点变化。HTTP/1.1 规范使用 303 状态码来实现同样的行为,为了避开这个问题,HTTP/1.1 规范明确指出,对于 HTTP/1.1 客户端,用 307 状态码取代 302 状态码来进行临时重定向。这样服务器就可以将 302 状态码保留起来,为 HTTP/1.0 客户端使用了。

  这样一来,服务器要选择适当的重定向状态码放入重定向响应时发送,就需要查看客户端的 HTTP 版本了。

400~499 客户端错误状态码

  有时客户端会发送一些服务器无法处理的东西,比如格式错误的请求报文,或者最常见的是请求一个不存在的 URL。所谓 404,只是服务器在告诉我们——它对我们请求的资源一无所知。

  很多客户端错误都是由浏览器来处理的,甚至不会打扰到你。只有少量错误(例如 404)可以穿过浏览器到用户前。

状态码 原因短语 含义
400Bad Request 告知客户端它发送了一个错误的请求
401Unauthorized 与适当的首部一起返回,在获取资源的访问权之间对自己进行认证
402Payment Required 这个状态码并未有使用,保留
403Forbidden 用于说明请求被服务器拒绝了,通常是服务器不想说明拒绝原因的时候使用的
404Not Found 用于说明服务器无法找到所请求的 URL,通常会包含一个实体,以便给用户看
405Method Not Allowed 发起的请求中带有所请求的 URL 不支持的方法时,使用此状态码
406Not Acceptable 客户端可以指定参数来说明它们需要接收什么类型的实体,服务器没有与客户端相匹配的资源时,使用此代码
407Proxy Authentication Required 与 401 状态码类似,但用于要求对资源进行认证的代理服务器
408Request Timeout 如果客户端完成请求所花的时间太长,服务器可以回送此状态码并关闭连接
409Conflict 用于说明请求可能在资源上引发一些冲突,服务器担心请求会引发冲突时可以发送此代码
410Clone 与 404 类似,只是服务器曾经拥有过此资源,主要用于 web 站点的维护
411Length Required 服务器要求请求报文中包含 Content-Length 首部时使用
412Precondition Failed 客户端发起了条件请求,且其中一个条件失败了的时候使用
413Request Entity Too Large 客户端发送的实体主体部分比服务器能够或者希望处理的要大时使用此状态码
414Request URL Too Long 客户端所请求的 URL 比服务器能够或者希望处理的要长时,使用此状态码
415Unsupported Media Type 服务器无法理解或无法支持客户端所发实体的内容类型时,使用此状态码
416Requested Range Not Satisfiable 请求报文所请求的是指定资源的某个范围,而此范围无效或无法满足时,使用此状态码
417Expectation Failed 请求的 Expect 请求首部包含了一个期望,但服务器无法满足此期望时,使用此状态码

500-599 服务器错误状态码

  有时客户端发送了一条有效请求,服务器自身却出错了,这可能是客户端碰上了服务器的缺陷,或者服务器上的子元素(比如网关)出了错

  代理尝试着代表客户端与服务器进行交流时,经常会出现问题。代理会发布 5XX 服务器错误状态码来描述所遇到的问题(以后会做出更详细的解释)

状态码 原因短语 含义
500Internal Server Error 服务器遇到一个妨碍它诶请求提供服务的错误时,使用此状态码
501Not Implemented 客户端发起的请求抄出服务器的能力范围(比如使用服务器不支持的请求方法)时,使用此状态码
502Bad Gateway 作为代理或网关使用的服务器从请求响应链的下一条链路上收到一条伪响应(比如无法连接父网关时),使用此状态码
503Service Unavailable 说明服务器现在无法为请求提供服务,但将来可以(不知道什么时候资源会变为可用的)
504Gateway Timeout与状态码 408 类似,只是这里的响应来自一个网关或代理,它们在等待另一个服务器对其请求进行响应时超时了
505HTTP Version Not Supported 服务器收到的请求使用了它无法或不愿意支持的协议版本时,使用此状态码,有些服务器应用程序会选择不支持协议的早期版本
    dengzx
    dengzx  2020-05-05, 22:32

    之前看字节跳动后端面经有问到1xx/2xx/301/302/4xx/500/503/504,xx表示说几个常见的
    加油,字节阿里腾讯(BAT)等着你