HTTP状态码 — 混圈子必备”语言“

2,269 阅读6分钟

前言

404 — 对于普通人来说,它是“四百零四”,是一个用十进制表示的数字,但对于开发者,尤其是web相关的开发者来说,它指相关资源没找到,表示了一种“不存在”的意思,如果我要隐含的表示我的某个东西不见了,我可以说“我的东西404了”(它的设计哲学中隐藏着加密学和压缩学)。在HTTP架构体系中,状态码是很重要的一环,它用各种协商好的数字字符来指代客户端和服务端在通信时遇到的各种情况,在前后端分离的当前环境下,前后端处于分离状态,了解各状态码的指代含义对于加快开发进度和调试进度意义重大。

各状态码解列

一、1xx:信息响应( Informational response)

简介:表示响应已被服务端接收、理解,但还需做进一步处理,该类型状态码往往是临时性的,因为马上将会变为以下状态之一:成功(2xx)、重定向(3xx)、异常或错误(4xx或5xx)

二、2XX:请求成功(Success)

简介:表示客户端发送的请求已成功被服务端接收、理解、接受

  • 200 成功(ok):标准的HTTP请求响应成功状态码,get请求中,响应将包含与请求对应的实体,post请求中,响应将包含实体的描述或实体的操作结果。
  • 202 已接受请求(Accepted):服务端接受了请求,但还没处理,最终可能会成功、或不会被执行或禁止执行
  • 204 无内容(No Content):服务端成功处理了请求,但没返回任何内容
  • 205 重置内容(Reset Content):服务端成功处理了请求,但没返回任何内容,区别于204的是:该响应要求客户端重置文档视图。
  • 206 部分内容(Partial Content):服务端成功处理了请求的部分内容,该状态码一般用于HTTP下载工具的断点续传功能或多个下载的分段进行(如迅雷下载)

三、3XX:重定向(Redirection)

简介:表示客户端需要采取进一步的操作才能完成请求,该状态码常用于URL重定向,后续的请求地址在本次响应的Location域中指明

  • 301 永久移动(Moved Permanently):被请求资源已被永久的转移到新位置,并且将来对此资源的引用都应该使用它返回的URI之一,新的永久性URI将在Location域中返回 —— 永远也别来烦我,去找张三吧。
  • 302 临时移动(Found,原始短语为Moved Temporarily):由于移动是临时的,客户端以后还是用原来的地址发送请求,新的临时URI将在Location域中返回
  • 303 看其它(See Other):请求的地址已经被移动,请求的对应地址可以在另一个URI上被找到
  • 304 未修改(Not Modified):表示当前资源的版本在根据请求头的If-Modified-Since和If-None-Match参数判断缓存后,资源未曾被修改,这样客户端不需要重新传新资源,客户端仍然使用上次下载的资源复件。

四、4XX:客户端错误(Client errors),

简介:表示错误情况可能是由客户端导致的,除非是一个HEAD请求,否则服务器应该把错误请求的详细解释实体抛出来阐述错误情况,这个错误信息应该告诉是临时的还是永久状况,该状态码适用于任何请求方法。客户端应该尽可能把错误实体展示给用户。

  • 400 错误请求(Bad Request):明显的客户端错误请求(如:语法缺陷,请求包过大、无效的请求消息片段、欺诈性请求路由)
  • 401 未授权(Unauthorized):类似于403 Forbidden错误,但不同的是该错误是指在特定的认证情况下,用户未能通过认证(如:登陆认证)
  • 403 已拒绝(Forbidden):该请求已被服务器验证为有效,但是服务器拒绝了它的操作,一般是因为用户没有取得对应资源的使用权。
  • 404 未找到(Not Found)
  • 405 方法不被允许(Method Not Allowed):该请求方法不支持对需请求资源的访问。如:明明是需要post方法的,你却给我传了个get方法
  • 406 请求无法接受(Not Acceptable):请求资源的内容格式无法满足请求头中的要求,因而无法生成响应体,故无法接受,请求的格式由Content-type头重定义的媒体类型决定
  • 408 请求超时(Request Timeout):客户端没有在服务器预备等待的时间内完成一个请求的发送,客户端可以随时再次提交这一请求而无需进行任何更改。
  • 409 冲突(Confict):因为请求存在冲突无法处理,比如多人在线编辑工具出现的冲突

五、5XX:服务器错误(Server errors)

简介:表示服务端无法完成请求,该状态表示服务端在处理请求的过程中发生了错误或异常

  • 500 内部服务错误(Internal Server Error):通用错误消息,服务端遇到了一个未曾预料的情况(如:服务端可能没有使用try catch等错误处理机制来抓到并处理错误异常),无法给出更具体的错误消息来解释 —— 我的错,但我不知道我错哪了
  • 501 请求无法实现(Not implemented):服务端不支持当前请求中所需的某个功能—— 臣妾做不到啊!
  • 502 损坏的网关(Bad Gateway):作为网关或代理工作的服务端尝试执行请求时,从上游服务器接收到无效的响应。
  • 503 服务不可用(Service Unavailable):由于临时的请求过载,导致服务端无法处理请求,该状况只是暂时的,并且会在一段时间后恢复,如果能预计延迟时间,那么响应中包含一个Retry-After头来标明延迟时间

附加知识点:

  • Head方法:它与get方法几乎一样,但该方法只请求资源的头部信息(头部信息和get方法的头部信息一样),不会请求响应实体部分(即使包含了也会被忽略),因为head方法的该特性,我们可以利用它测试、获取到对应资源的相关“摘要信息”,来决定采取的步骤,一个使用场景是在下载一个大文件时先获取其大小,再考虑是否下载它。—— 它是一个触手试探器,就像一个侦察兵一样

后记

就我个人的理解,对于大部分开发者来说,了解常用的状态码,有一个状态码的框架图足以,如果发现了错误自己不清楚的上wiki或w3c找即可,不需要死记硬背,但它还是很重要的,所以需要在日常开发中多多关注一些状态码指代的隐含意思,就像你不知道“2333”这个词语无法混二次元圈子一样,了解状态码也是一种混圈子的基础装逼属性。

参考