手摸手,跟你一起总结HTTP状态码

135 阅读5分钟

HTTP状态码有非常多种,但实际上只要掌握少数常用常见的状态码即可,总结如下。

状态码的类别

HTTP状态码总共分为一下5大类

Name类别原因短语
1XXInformation 信息性状态码接受的请求正在处理
2XXSuccess 成功状态码请求正常处理完毕
3XXRedirection 重定向状态码需要进行 附加操作以完成请求
4XXCLient Error 客户端错误状态码服务器无法处理请求(客户端请求有问题
5XXServer Error 服务器错误状态码服务器处理请求出错

常用的14个状态码

2XX 请求正常处理完毕

200 OK

204 No Content

服务器接收的请求已成功处理,但在 返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。

e.g. 当从浏览器发出请求处理后,返回204 NoContent,那么浏览器显示的页面不发生更新

206 Partial Content(部分内容,partial)

客户端进行了 范围请求,而服务器成功执行了这部分的GET请求。

响应报文中包含了 由Content-Range指定范围的实体内容。

3XX重定向(浏览器需要执行某些特殊的处理以正确处理请求)

301 Moved Permanently(永久重定向)

永久重定向,表示 请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI

也就是说,如果已经把资源对应的URI保存为书签,这时应该按Location首部字段提示的URI重新保存。需要更新书签。

302 Found(临时重定向)

临时重定向,表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。

与301永久重定向相似,但302代表的资源不是被永久移动,只是临时性的。(以后还可能会继续移动,URI改变。

303 See Other

表示由于 请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。

303 和 302 Found有着相同的功能,但303状态码明确表示客户端应当使用GET方法获取资源。

当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文中的主体,之后请求会自动再次发送。 301、302标准是禁止将POST方法改成GET的,但实际使用时大家都会这么做。

304 Not Modified(服务器资源未改变,可直接使用客户端未过期的缓存)

这个状态码是比较常见的,也非常重要。

附带条件的请求: GET方法请求的请求报文中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中 任一首部。

  • 304 表示客户端发送 附带条件的请求时,服务器允许请求访问资源,但因 发生请求没有满足条件的情况后,直接返回304 Not Modified, 服务器资源未改变,可直接使用客户端未过期的缓存。
  • 304状态码 返回时,不包含任何响应的主体部分。
  • 304 虽然被划分在 3XX类别中,但是和 重定向没有关系。

307 Temporary Redirect(临时重定向)

临时重定向。

307 与 302Found 有着相同的含义。尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守。

307会遵照浏览器标准,不会从POST变成GET,但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。

4XX 客户端错误(客户端是错误的原因所在)

400 Bad Request

表示请求报文中存在 语法错误,需要修改请求的内容再次发送请求。

另外,浏览器会像200 OK一样对待该状态码。

401 Unauthorized

403 Forbidden(资源不允许访问)

表明对 请求资源的访问被服务器拒绝了。(e.g. 从未授权的发送源IP地址试图访问,这个在很多网站上也是非常常见的)

服务器没有必要给出拒绝的详细理由,要给出的话,可以在实体的主体部分对原因进行描述。

404 Not Found

资源不存在,无法找到。

除此之外,也可以在服务器端拒绝请求且不想说明理由时使用,你懂的~~

5XX 服务器错误(服务器本身发生错误)

500 Internet Server Error

执行请求时发生了错误。or Web应用内部bug or 临时故障。

503 Service Unavailable(无法处理请求,服务器“不行”)

服务器无法处理请求,暂时处于超负载or 正在进行停机维护。

如果事先得知 解除以上状况需要的时间,最好写入 Retry-After 首部字段再返回给客户端。

项目实际使用

4XX 状态码使用实践

在现如今的前端项目使用中,4XX错误一般都不会直接暴露给用户,前后端的接口也建议使用 200状态码 + code - data - message数据返回的格式,举个例子:

// HTTP 200 OK
{
    code: 40003,
    data: "error",
    message: "当前用户无权限访问此资源"
}

// HTTP 200 OK
{
    code: 200,
    data: "我是请求返回的资源",
    message: "OK"
}

但是,假如是请求一个需要有登录权限的网站,但是还没登录的时候,可以 返回 HTTP 401 Unauthorized 状态码,然后在前端项目中添加跳转登录页面的逻辑。

具体实现还是要根据项目的实际场景和数据隐私要求来的。

5XX

通常来说,web服务如果出现 5XX类错误,就是比较大的后端服务事故了。前端同学在实现需求的时候,应该尽量避免页面因接口返回错误而逻辑卡死,这个要进入具体的项目逻辑中实现。