摘要
文章摘自:
# 一:前言
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。HTTP状态码的英文为HTTP Status Code。
# 二:常见的HTTP状态码
200 - 请求成功
301 - 资源(网页等)被永久转移到其它
URL 200和304都可以认为请求成功,200还要readystatus为4,这两个符合就可以去加载了
----------
404 - 请求的资源(网页等)不存在,请求故障
500 - 内部服务器错误,服务端故障
HTTP状态码分类 HTTP状态码由三个十进制数字组成,第一个十进制数字
定义了状态码的类型,后两个数字没有分类的作用。
# 三:HTTP状态码类型
HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。响应分为五类:
- Informational responses - 信息(100–199):服务器收到请求,需要请求者继续执行操作。
- Successful responses - 成功(200–299):操作被成功接收并处理。
- Redirection messages - 重定向(300–399):需要进一步的操作以完成请求。
- Client error responses - 客户端错误(400–499):请求包含语法错误或无法完成请求。
- Server error responses - 服务器错误(500–599):服务器在处理请求的过程中发生了错误。
状态代码由 RFC 2616第10节 (opens new window) 中定义。也可在 RFC 7231 (opens new window) 找到最新的规范。
# 四:信息
# 100
100 Continue 继续
:此临时响应指示客户端应继续请求或如果请求已完成则忽略响应。
说明
为了让服务器检查请求的首部, 客户端必须在发送请求实体前, 在初始化请求中发送 Expect: 100-continue
首部并接收 100 Continue
响应状态码.
# 101
101 Switching Protocols 切换协议
:服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议;客户端可以使用它将将 HTTP 1.1 升级到 HTTP 2.0,或者将 HTTP 或 HTTPS 升级到 WebSocket。
警告:HTTP/2 明确禁止使用此机制/标头; 它仅限于 HTTP/1.1。
说明
在使用 WebSockets 时会用到协议切换
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
2
3
# 102
102 Processing 处理
:用于通知客户端服务器已接受完整请求但尚未完成的一个临时响应。
说明
这个状态码应该只有在当服务器有一个合理预期请求需要花费大量时间时被发送。作为指导,如果一个方法需要花费超过 20 秒(一个合理但是可以是任意值)来处理,则服务器应该返回一个 102 (处理中)响应。服务器必须在请求完成后发送最终响应。
方法可能需要很长时间才能处理,特别是支持 Depth header 时。在这种情况下,客户端可能会在等待响应时超时连接。 为了防止这种情况,服务器可能会返回 102-处理中 的状态码,以向客户端表明服务器仍在处理该方法。
一般用在WebDAV
WebDAV(Web 分布式创作和版本控制)是一个 HTTP 扩展,它允许 Web 开发人员从客户端远程更新他们的内容。在标准的HTTP协议上扩展了特定的请求方式:PROPFIND、MOVE、COPY等然后用这些请求,操作WEB服务器上的磁盘(例如:网盘)
更多可以访问:知乎 (opens new window)
# 103
103 Early Hints 早期提示
:此状态代码主要用于 Link 标头,让用户代理在服务器准备响应时开始预加载资源。
说明
HTTP/1.1 200 OK
Date: Fri, 26 May 2017 10:02:11 GMT
Content-Length: 1234
Content-Type: text/html; charset=utf-8
Link: </main.css>; rel=preload; as=style
Link: </newstyle.css>; rel=preload; as=style
Link: </script.js>; rel=preload; as=script
2
3
4
5
6
7
在头部信息到达之前,用户可以开始预加载CSS和JavaScript文件,这是一个很好的优化。
因此,向不合格的客户机发送多个标头存在各种各样的安全风险:"因此,如果客户不知道正确处理信息响应,服务器可能会避免发送HTTP / 1.1的早期提示。"
HTTP Link 字体头字段提供了在 HTTP 头中序列化一个或多个链接的方法。语义上等价与HTML <link>
元素
Link: <uri-reference>; param1=value1; param2="value2"
url-reference可以是绝对或相对,例如:Link: <https://example.com>; rel="preconnect"
可以用逗号分隔多个链接,例如:Link: <https://one.example.com>; rel="preconnect", <https://two.example.com>; rel="preconnect", <https://three.example.com>; rel="preconnect"
HTML 例子:
<head>
<meta charset="utf-8">
<title>JS and CSS preload example</title>
<link rel="preload" href="style.css" as="style">
<link rel="preload" href="main.js" as="script">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>bouncing balls</h1>
<canvas></canvas>
<script src="main.js" defer></script>
</body>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
这里预先加载CSS和JavaScript文件,这样它们将尽快可用。随着后续资源的发现和增大,其好处可以更清楚地看到。例如:
- 从 CSS 内部指向的资源,如字体和图像。
- JavaScript 可以请求的资源,例如 JSON、导入的脚本或web workers
- 更大的图片和视频文件
preload 预加载
还有其他优点,使用 as
指定要预加载的内容类型。例如:
- 更准确地安排资源转载的优先级
- 存储在缓存中以备将来的请求,如果适当的话重用资源。
- 对资源应用正确的内容安全策略。
- 设置正确的Accept请求标头。
什么类型的内容可以预加载?
audio
:音频文件,通常用于<audio>
document
:一个HTML文件,用于嵌入<frame>
或<iframe>
embed
:嵌入到<embed>
元素的资源fetch
:要通过 fetch 或 XHR 请求访问的资源,例如 ArrayBuffer 或 JSON 文件font
:字体文件image
:图片文件object
:要嵌入到<object>
元素中的资源script
:JavaScript 文件。style
:CSS样式track
:WebVTT 文件worker
: A JavaScript web worker or shared worker.video
:视频文件,通常用于<video>
【浏览器目前还未实现】
更多功能详情,可查看Link types: preload (opens new window)
# 五:成功
# 200
200 OK 请求成功
:表明请求已经成功,默认情况下,状态码200的响应可以被缓存。
GET
: 已经取得资源,并将资源添加到响应的消息体中。HEAD
: 响应的消息体为头部信息。POST
: 响应的消息体中包含此次请求的结果。TRACE
: 响应的消息体中包含服务器接收到的请求信息。
PUT
和 DELETE
的请求成功通常并不是响应200 OK的状态码而是 204 No Content
表示无内容(或者 201 Created
表示一个资源首次被创建成功)。
# 201
201 Created 已创建
:该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。
# 202
202 Accepted 已接受
:请求已被接受,但尚未处理。最终该请求可能不会被执行。适用于异步操作场合,允许服务器接受其他过程请求,而不用让客户端一直保持与服务器的连接知道批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。
说明
202状态码适合异步任务或者说需要处理时间比较长的请求,避免HTTP连接一直占用,超时这些情况。常见的就是使用MQ异步处理批任务,客户端定时轮训结果。
例子:
接口的模式client第一次请求得到一个TaskID + 202状态码,之后需要client根据TaskID轮训,直到得到结果:
client -----post + 参数--------> server
<----202 + TaskID -------
client -----get + TaskID -----> server
1| <- 202 + status:runing--
2| <- 200 + status:done + 返回内容
3| <- 404 or 500
如果是202还需要继续轮训
2
3
4
5
6
7
8
9
10
11
一个接口为 /api/v1/month_report,功能是返回某个月的报表数据,处理耗时一般30~60秒,可以这样设计
client 发送
POST /api/v1/month_report
参数为{'month':'2019-02'}
,服务端接受参数并且返回状态码 202,body 为{'taskid': 'cxxxx0001'}
,服务端下发一个任务到MQ或者其他异步处理的方式,同时记录 taskcxxxx0001
的状态为running
。10秒之后 client 发送
GET /api/v1/month_report/cxxxx0001
获取任务结果,此时服务端可能有几种情况:- 任务成功,返回 200,内容为
{"status": "done", "details": {....}}
- 任务还在执行中,返回 202, 内容为
{"status": "running"}
- 任务失败,返回 200(或者404), 内容为
{"status": "failure"}
- 任务成功,返回 200,内容为
如果client获取到是202状态,再过20s重试一次,比如说2分钟之后仍然没有成功,可以继续轮训,或者根据需要定义timeout, client方认为调用失败
当然还要根据业务情况在具体设计,上面只是个简单的参考
# 203
203 Non-Authoritative Information 非授权信息
:请求成功。但返回的meta信息不在原始的服务器,而是一个副本
说明
简单的说,就是通过代理访问原始服务器的时候,成功获取了原始服务器(状态200)的返回内容,但是代理对内容做出了一些改动,例如修改了文档编码等等,代理通过这个状态码告知用户,成功获取内容,但是这部分内容和原始服务器的返回内容可能不完全一致。
例如:
HTTP请求Proxy再到Origin Server过程:
- 请求:Client ---> Proxy ---> Origin Server.
- 源服务器返回内容给代理:Proxy <--- Origin Server:得到内容。例如:index.html
- Proxy 有自定义设置,比如:过滤掉一些广告内容,或者移除一些敏感信息 那么原始index.html变为修改后的index.html
- 代理返回修改后的内容给客户端:Client <--- Proxy 使用状态码203(Non-Authoritative Information)表示内容和源站的原始内容不一样。
# 204
204 No Content 无内容
:服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
说明
意思等同于请求执行成功,但是没有数据,浏览器不用刷新页面.也不用导向新的页面。
例子:
- a标签,如果链接的页面响应码为204,页面也不会发生跳转
- 假设页面上有个form,提交的url为http-204.htm,提交form,正常情况下,页面会跳转到http-204.htm,但是如果http-204.htm的相应的状态码是204,此时页面就不会发生转跳,还是停留在当前页面
使用惯例是,在 PUT
请求中进行资源更新,但是不需要改变当前展示给用户的页面,那么返回 204 No Content。如果创建了资源,则返回 201 Created
。如果应将页面更改为新更新的页面,则应改用 200
# 205
205 Reset Content 重置内容
:服务器处理成功,用户终端(例如:浏览器)应重置文档视图。例如清除表单内容,重置画布状态或刷新 UI。
目前无浏览器支持205,大部分的浏览器都会把205当作204或者200同样对待
# 206
206 Partial Content 部分内容
:服务器成功处理了部分GET请求
说明
换而言之,请求已成功处理,但仅返回了部分内容。
类似于迅雷这类的HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range
头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range
来作为请求条件。
# 207
207 Multi-Status (WebDAV) 多状态
:传递多个资源的信息,适合使用可能返回多个资源的情况。
说明
HTTP 207 表示由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体可能是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
例如:
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx
<d:multistatus xmlns:d="DAV:">
<d:response>
<d:href>/calendars/johndoe/home/132456762153245.ics</d:href>
<d:propstat>
<d:prop>
<d:getetag>"xxxx-xxx"</d:getetag>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
<d:response>
<d:href>/calendars/johndoe/home/fancy-caldav-client-1234253678.ics</d:href>
<d:propstat>
<d:prop>
<d:getetag>"5-12"</d:getetag>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
</d:multistatus>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 208
208 Already Reported (WebDAV)
:响应已发送。不会再次发送。DAV绑定的成员列表已经包含在前一个响应中,并且不会再次发送。
# 226
226 IM Used (HTTP Delta encoding)
:服务器已完成对资源的 GET
请求,响应是对当前实例应用的一个或多个实例操作结果的表示。
# 六:重定向
# 300
300 Multiple Choices 多种选择
:请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择。
说明
一个用来表示重定向的响应状态码,表示该请求拥有多种可能的响应。用户代理或者用户自身应该从中选择一个。由于没有如何进行选择的标准方法,这个状态码极少使用。
假如服务器可以提供一个优先选择,那么它应该生成一个 Location
首部。
# 301
301 Moved Permanently 永久移动
:请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
# 302
302 Found 临时移动
:与301类似。但资源只是临时被移动。客户端应继续使用原有URI
# 303
303 See Other 查看其它地址
:与301类似。使用 GET
和 POST
请求查看
# 304
304 Not Modified 未修改
:所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
# 305
305 Use Proxy 使用代理
:所请求的资源必须通过代理访问
# 306
306 Unused
:已经被废弃的HTTP状态码
# 307
307 Temporary Redirect 临时重定向
:与302类似。使用GET请求重定向
从实际效果看:302 允许各种各样的重定向,一般情况下都会实现为到GET的重定向,但是不能确保POST会重定向为POST;而 303 只允许任意请求到GET的重定向;307 和 302 一样,除了不允许POST到GET的重定向。
# 308
308 Permanent Redirec 永久重定向
:308 的定义实际上和301是一致的,唯一的区别在于,308 状态码不允许浏览器将原本为POST的请求重定向到GET请求上。
相关关系具体查看:HTTP 中的 301、302、303、307、308 响应状态码 (opens new window)
# 七:客户端错误
# 400
400 Bad Request 坏请求
:客户端请求的语法错误,服务器无法理解。客户不应未经修改就重复此请求
# 401
401 Unauthorized 未授权
:要求用户进行身份认证
说明
指示该请求尚未应用,因为它缺少目标资源的有效认证凭证。此状态与包含有关如何正确授权信息的 WWW-Authenticate
标头一起发送。这种状态与此类似 403
,但在这种情况下,身份验证是可能的。
响应示例
HTTP/1.1 401 Unauthorized
Date: Wed, 21 Oct 2015 07:28:00 GMT
WWW-Authenticate: Basic realm="Access to staging site"
2
3
# 402
402 Payment Required 需要付款
:此响应代码保留供将来使用。创建此代码的最初目的是将其用于数字支付系统,但是此状态代码很少使用,并且不存在标准约定。
# 403
403 Forbidden 拒绝访问
:服务器理解请求客户端的请求,但是拒绝执行此请求。可以理解为无权限
# 404
404 Not Found
:服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。导致404页面的链接通常被称为断开或死链接,并且可能受到链接形势变化的影响。404 状态代码不表示资源是暂时还是永久缺失。但是,如果资源被永久删除,应该使用 410 而不是 404 状态。
# 405
405 Method Not Allowed 方法被禁止
:客户端请求中的方法被禁止。服务器已知请求方法,但已被禁用且无法使用。这两个强制性方法,GET
和 HEAD
,绝不能被禁用,不应返回该错误代码。
# 406
406 Not Acceptable 不能接受的
:服务器无法根据客户端请求的内容特性完成请求。指示与在其中定义 Accept-Charset
和 Accept-Language
不能提供的可接受值列表匹配的响应。
事实上,这个错误很少被使用:服务器不是使用这个对最终用户来说很模糊的错误代码(而且很难修复)进行响应,而是忽略相关头文件并向用户提供实际页面。假定即使用户不会完全开心,它也会更喜欢这个错误代码。
如果服务器返回这种错误状态,则消息正文应包含资源可用表示的列表,允许在其中手动进行选择。
# 407
407 Proxy Authentication Required 需要代理身份验证
:请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
说明
指示该请求尚未应用,因为它缺少浏览器和可访问所请求资源的服务器之间的代理服务器的有效认证凭证。
此状态与包含有关如何正确授权信息的Proxy-Authenticate
标头一起发送。
HTTP/1.1 407 Proxy Authentication Required
Date: Wed, 21 Oct 2015 07:28:00 GMT
Proxy-Authenticate: Basic realm="Access to internal site"
2
3
# 408
408 Request Time-out 请求超时
:服务器等待客户端发送的请求时间过长,超时
# 409
409 Conflict 冲突
:冲突最有可能发生以回应PUT
请求,服务器处理请求时发生了冲突。例如,在上传比服务器上已存在的文件更早的文件时,可能会收到409响应,从而导致版本控制冲突。
# 410
410 Gone
:客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
# 411
411 Length Required 长度要求
:服务器无法处理客户端发送的不带 Content-Length
的请求信息。请注意,根据规范,在一系列块中发送数据时,Content-Length
头部将被忽略,并且在每个块的开始处,您需要以十六进制格式添加当前块的长度。查看Transfer-Encoding
更多细节
# 412
412 Precondition Failed 先决条件失败
:客户端请求信息的先决条件错误
# 413
413 Request Entity Too Large 请求的实体过大
:由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
# 414
414 Request-URI Too Large 请求的URI过长
:网址过长,服务器无法处理
# 415
415 Unsupported Media Type 不支持的媒体类型
:服务器无法处理请求附带的媒体格式
# 416
416 Requested range not satisfiable 请求的范围不满足
:客户端请求的范围无效
# 417
417 Expectation Failed
:服务器无法满足Expect的请求头信息
# 418
418 I'm a teapot
# 421
421 Misdirected Request
# 422
422 Unprocessable Entity (WebDAV) 实体无法处理
# 423
423 Locked (WebDAV) 锁定
# 424
424 Failed Dependency (WebDAV)
# 425
425 Too Early 为时过早
# 426
426 Upgrade Required 需要升级
# 428
428 Precondition Required 需要前置条件
# 429
429 Too Many Requests 过多的请求
# 431
431 Request Header Fields Too Large 请求头字段太大
# 451
451 Unavailable For Legal Reasons 因法律原因不可用
# 八:服务器错误
# 500
500 Internal Server Error 服务器内部错误,无法完成请求
# 501
501 Not Implemented 服务器不支持请求的功能,无法完成请求
# 502
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
# 503
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
# 504
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
# 505
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理
# 506
506 Variant Also Negotiates
# 507
507 Insufficient Storage (WebDAV) 存储空间不足
# 508
508 Loop Detected (WebDAV) 检测到循环
# 510
510 Not Extended 无法拓展
# 511
511 Network Authentication Required 需要网络验证