1. 2xx
    1. 200 OK
    2. 201 created
    3. 202 Accepted
    4. 203 Non-Authoritative Information
    5. 204 No Content
  2. 3xx
    1. 301 Moved Permanently
    2. 302 Found
    3. 304 Not Modified
    4. 307 Temporary Redirect
    5. 308 Permanent Redirect
  3. 4xx
    1. 401 Unauthorized
    2. 403 Forbidden
    3. 404 Not Found
    4. 405 Method Not Allowed
    5. 408 Request Timeout
    6. 409 Conflict
    7. 410 Gone
    8. 413 Request Entity Too Large
    9. 414 Request-URI Too Long
    10. 415 Unsupported Media Type
    11. 418 I'm a teapot
    12. 451 Unavailable For Legal Reasons
  4. 5xx
    1. 500 Internal Server Error
    2. 503 Service Unavailable
  5. 参考

HTTP 响应状态码

HTTP 响应状态码(HTTP Response Status Code) 用于表示服务器对此次 HTTP 请求的响应结果(服务器是否正常, 是否返回了数据).
其由是一个3位整数的状态码(status-code)及一个原因短语(reason-phrase)组成,状态码和原因短语间用空格隔开(例如最常见的表示请求成功的 200 OK).
1234.PNG

通常可以用 XMLHttpRequest.status 属性来获取返回的状态码.

1
2
3
4
5
6
7
8
var xml = new XMLHttpRequest();
xml.open('GET', 'https://httpstat.us/200');
xml.onreadystatechange = () => {
if (xml.readyState === 4) {
console.log(xml.status) // 200
}
}
xml.send();

fetch 的话也一样

1
fetch('https://httpstat.us/200').then(response => console.log(response.status))  // 200

status-code 的第一个数字用于区分响应的类别,一共可分为 5 大类.

  • 1xx (Informational responses) 信息提示
  • 2xx (Successful responses) 请求成功
  • 3xx (Redirects) 重定向
  • 4xx (Client errors) 客户端错误
  • 5xx (Server errors) 服务端错误

2xx

200 OK

请求成功,并根据请求类型返回对应的数据.

201 created

请求成功,并根据请求创建了一个或多个资源.

202 Accepted

请求成功,但还未处理.并可能不会处理该请求.

203 Non-Authoritative Information

请求成功, 但原服务器返回的内容(响应码为 200)可能被代理修改.

204 No Content

请求成功,但没有返回任何数据.该响应码传输的数据量最小,因此常用于统计用户的访问信息.

3xx

301 Moved Permanently

永久重定向,表示请求的资源已经被永久移动到其他地址. 移动后的地址储存在响应头的 Location 首部中.

1
fetch('https://httpstat.us/301')

301.PNG

1
fetch('https://httpstat.us/301', {method: 'POST'})  

由于历史原因, 用户代理可能会在后续请求时将 POST 请求更改为 GET.

301p.PNG

302 Found

临时重定向, 表示请求的资源被临时移动到其他地址.移动后的地址储存在响应头的 Location 首部中.

1
fetch('https://httpstat.us/302')

302.PNG

和301一样由于历史原因, 用户代理可能会在后续请求时将 POST 请求更改为 GET.

304 Not Modified

资源未更新.

当服务器返回的响应头中带有 If-None-Match 或 If-Modified-Since 首部时, 浏览器会根据这两个首部的字段值来判断用户所请求的资源是否有更新.

如果资源发生了变化,则返回 200 状态码和对应的资源内容.
而资源没有更新时,仅返回 304 状态码,以表示未发生变化.

1
2
3
4
5
6
7
8
9
10
11
12
fetch('https://aaron-bird.github.io/', {
headers: {
'if-modified-since': 'Fri, 23 Aug 2019 02:20:54 GMT'
}
}).then(response => console.log(response.status)) // 304

// or
fetch('https://aaron-bird.github.io/', {
headers: {
'if-none-match': 'W/"5d5f4d86-8261"'
}
}).then(response => console.log(response.status)) // 304

If-None-Match/If-Modified-Since 所需的值由服务器生成并发送, 分别储存在响应头的 etag 和 last-modified 字段中. 浏览器会记住这两个值, 并在下一次请求时自动添加到请求头中.

这四者的对应关系如下:

response request
etag if-none-match
last-modified if-modified-since

304.PNG
一般来讲, 当请求头中同时存在 If-None-Match 和 If-Modified-Since 时, 应优先采用 If-None-Match .(但后端不一定要这样作).

307 Temporary Redirect

同302 临时重定向, 表示请求的资源被临时移动到其他地址.移动后的地址储存在响应头的 Location 首部中.

区别是明确规定了不允许用户代理在后去请求时将 POST 请求改为 GET 请求.

1
fetch('https://httpstat.us/307', {method: 'POST'})  

3011.PNG

308 Permanent Redirect

同 301 永久重定向, 表示请求的资源已经被永久移动到其他地址. 移动后的地址储存在响应头的 Location 首部中.

区别是明确规定了不允许用户代理在后去请求时将 POST 请求改为 GET 请求.

4xx

401 Unauthorized

需要验证身份(登录)

403 Forbidden

无权限,拒绝服务

404 Not Found

未找到资源

405 Method Not Allowed

不支持该请求方法. 返回的响应头中会包含一个 Allow 首部, 表示可用的请求方法.

1
fetch('https://google.com/search', {method: 'PUT'})  

405.PNG

408 Request Timeout

请求超时, 客户端没有在规定的时间内完成数据的发送.

409 Conflict

请求冲突

410 Gone

资源不再可用(以前有现在没了)

413 Request Entity Too Large

请求内容过大

414 Request-URI Too Long

请求 URI 长度过长

1
fetch('https://github.com/' + ''.padEnd(10000, 'g'))  

1234.PNG

415 Unsupported Media Type

不支持的媒体类型.例如服务器接收png,但是用户提交了jpg.

418 I'm a teapot

愚人节彩蛋,表示自己是个茶壶而非服务器.

1
fetch('https://www.google.com/teapot').then(res => console.log(res.status))  // 418

谷歌的愚人节彩蛋, 访问 teapot 页面会返回一个茶壶.
418.PNG

因违反法律而无法提供的内容会返回 451 状态码.
其数字 451 出自小说 <<华摄 451 度>>

5xx

500 Internal Server Error

服务器出错

503 Service Unavailable

服务器超载或正在维护

参考

https://zh.wikipedia.org/wiki/HTTP状态码
https://httpstatuses.com
说说浏览器端缓存的那点事儿-扑朔迷离的 etag 与 last-modified
HTTP Cats