看看http响应状态码(二)

631 阅读8分钟

上一篇里总结了响应状态码中的1xx,2xx,3xx三个系列,今天来看4xx和5xx系列

4xx系列

4xx系列表示客户端发送的请求报文有错误,服务端无法进行处理

  1. 400(Bad Request),400表明服务器不能或不会处理请求,通常是请求报文有错误(格式错误的请求语法等等)。400是一个笼统的表示错误的状态码,在实际开发应用中服务端应该给客户端返回更具有实际意义的4xx。
  2. 401(Unauthorized),401通常表示请求报文中缺少服务器所需的验证身份的信息。实际开发中请求报文的请求头中通常包括一个鉴权key,用作身份验证等等(上周开发中隔壁项目组竟然要求把鉴权字段放在url里,不怎么能理解)。
  3. 402(Payment Required),402目前是一个非标准的客户端错误状态响应代码,是保留为未来使用。
  4. 403(Forbidden),403表示服务器理解请求,但拒绝授权。
  5. 404(Not Found),404表示服务器无法找到所请求的资源。404不能确定资源是暂时丢失还是永久丢失。但是如果一个资源被永久删除,通常应该使用410而不是404。
  6. 405(Method Not Allowed),405表示该请求方法是服务端支持的方法,但是目标资源不支持,比如用post访问只支持get的资源。405响应报文中有Allow字段,他的值就是当前资源支持的请求方法列表。
  7. 406(406 Not Acceptable),406通常表示服务端和客户端在(Accept、Accept-Charset、Accept-Encoding、Accept-Language)这几个字段中的一个或某几个打不成共识,实际上这个错误码很少很少很少被使用。
  8. 407(Proxy Authentication Required),407表示客户端缺少和服务端之间的代理服务器的有效身份验证凭据,类似401,只不过是缺少代理服务器的鉴权,407响应头中包括Proxy-Authenticate,他的值提示如何正确通过授权。
  9. 408(Request Timeout),408表示服务端要关闭这个未使用的连接。它由一些服务端在空闲连接上发送,即使客户端之前没有任何请求。通常情况下服务端应该在响应中发送“close”连接头字段,因为408意味着服务端已经决定关闭连接,而不是继续等待。
  10. 409(Conflict),409表示与服务器当前状态的请求冲突。冲突最可能发生在对PUT请求的响应中。例如,当上传一个比服务器上已经存在的文件更旧的文件时,可能会得到一个409响应,提示可能导致版本控制冲突。
  11. 410(Gone),410表明服务端没有目标资源,并且这种情况可能是永久性的。410是可以被缓存的。
  12. 411(Length Required),411表示服务端拒绝接受没有定义Content-Length的请求。
  13. 412(Precondition Failed),412表示客户端错误,意味着对于目标资源的访问请求被拒绝。这通常发生请求方法不是get或head时,请求头字段If-Unmodified-Since或If-None-Match规定的先决条件不成立的情况下。这时候,请求的操作通常是上传或修改文件,服务端无法执行,从而返回该错误状态码。
  14. 413(Payload Too Large),413表示请求实体大小超出了服务端定义的限制,服务端可能会关闭连接或返回一个Retry-After。
  15. 414(URI Too Long),414表示客户端请求的URI超出了服务端希望解析的长度范围。
  16. 415(Unsupported Media Type),415表示服务端拒绝接受请求,因为负载格式是不支持的格式。格式问题可能是由于Content-Type或Content-Encoding的值,或者是直接检查数据的结果导致的。
  17. 416(Range Not Satisfiable),416表示服务端无法处理所请求的数据区间。最常见的情况是所请求的数据区间不在文件范围之内。
  18. 417(Expectation Failed),417表示服务端无法满足请求头Expect中给出的条件。
  19. 418(I'm a teapot),1998年愚人节玩笑。
  20. 422(Unprocessable Entity),422表示服务端理解请求实体的内容类型,请求实体的语法是正确的,但它无法处理包含的指令。
  21. 425(Too Early),425表示服务器不愿意处理可能会被重放的请求,这可能会造成重放攻击。
  22. 426(Upgrade Required),426表示服务端拒绝使用当前协议执行请求,但在客户端升级到不同协议后可能会执行请求。
  23. 428(Precondition Required),428表示服务端要求请求是有条件的。通常情况下这意味着缺少必要的前置条件头,比如If-Match。(当前置条件头与服务端状态不匹配时,应该使用412)。
  24. 429(Too Many Requests),429表示客户端在给定的时间内发送了太多的请求(“速率限制”)。此响应可能包含一个Retry-After头,指示在发出新请求之前等待多长时间。
  25. 431(Request Header Fields Too Large),431表示服务端拒绝处理请求,因为请求的HTTP头太长。在减少请求头的大小后,可以重新提交请求。当请求标头的总大小太大或单个标头字段太大时,可以使用431。通常情况下最好在响应体中指出这两者中的哪一个是问题,还包括哪些头太大。
  26. 451(Unavailable For Legal Reasons),451表示请求的资源由于法律原因不可用(此时客户端应该思考一下在请求什么资源)。

5xx系列

5××类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据。

  1. 500(Internal Server Error),500表示服务端遇到了阻止其完成请求的意外情况。这个错误响应是一个通用的“全面捕获”响应。服务端无法找到更详细的5xx错误代码来响应。有时,服务器管理员会将错误响应(如500状态码)记录为请求的详细信息,以防止将来再次发生错误。
  2. 501(Not Implemented),501表示服务端不支持满足请求所需的功能。响应报文中还可以包含Retry-After头,告诉客户端什么时候返回看查看是否支持该功能。
  3. 502(Bad Gateway),502表示服务器作为网关或代理,收到了来自上游服务器的无效响应。502错误通常不是客户端能够修复的,而是需要由途径的Web服务器或者代理服务器对其进行修复。遇到502时,客户端开发人员最好的解决办法就是站起来喝口水活动一下。
  4. 503(Service Unavailable),503表示服务端没有准备好处理请求。常见的原因是服务器因维护而关闭或过载。如果可能的话,重试后的HTTP头应包含服务恢复的估计时间。
  5. 504(Gateway Timeout),504表示服务器在充当网关或代理时,没有及时从上游服务器获得完成请求所需的响应。自己等待的时间超出了限制。
  6. 505(HTTP Version Not Supported),503表示表示服务端不支持请求中使用的HTTP版本。
  7. 511(Network Authentication Required),511表示客户端需要进行身份验证才能获得网络访问。此状态码不是由源服务器生成的,而是通过拦截控制对网络访问的代理生成的。网络运营商在授予访问权限之前,有时需要进行一些身份验证、接受条款或其他用户交互(例如在网吧或机场)。

附属说明

下一篇可能会总结一下http协议请求头常用的字段。文中如有问题,请多多指教,感恩。