HTTP 响应代码

11/4/2021 网络协议HTTP

# 一:前言

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。HTTP状态码的英文为HTTP Status Code。

# 二:常见的HTTP状态码

200 - 请求成功

301 - 资源(网页等)被永久转移到其它

URL 200和304都可以认为请求成功,200还要readystatus为4,这两个符合就可以去加载了

----------

404 - 请求的资源(网页等)不存在,请求故障

500 - 内部服务器错误,服务端故障

HTTP状态码分类 HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。

# 三:HTTP状态码类型

HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。响应分为五类:

  1. Informational responses - 信息(100–199):服务器收到请求,需要请求者继续执行操作。
  2. Successful responses - 成功(200–299):操作被成功接收并处理。
  3. Redirection messages - 重定向(300–399):需要进一步的操作以完成请求。
  4. Client error responses - 客户端错误(400–499):请求包含语法错误或无法完成请求。
  5. 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
1
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
1
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>
1
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: 响应的消息体中包含服务器接收到的请求信息。

PUTDELETE 的请求成功通常并不是响应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还需要继续轮训
1
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或者其他异步处理的方式,同时记录 task cxxxx0001 的状态为 running

  • 10秒之后 client 发送 GET /api/v1/month_report/cxxxx0001 获取任务结果,此时服务端可能有几种情况:

    • 任务成功,返回 200,内容为 {"status": "done", "details": {....}}
    • 任务还在执行中,返回 202, 内容为 {"status": "running"}
    • 任务失败,返回 200(或者404), 内容为 {"status": "failure"}
  • 如果client获取到是202状态,再过20s重试一次,比如说2分钟之后仍然没有成功,可以继续轮训,或者根据需要定义timeout, client方认为调用失败

当然还要根据业务情况在具体设计,上面只是个简单的参考

# 203

203 Non-Authoritative Information 非授权信息:请求成功。但返回的meta信息不在原始的服务器,而是一个副本

说明

简单的说,就是通过代理访问原始服务器的时候,成功获取了原始服务器(状态200)的返回内容,但是代理对内容做出了一些改动,例如修改了文档编码等等,代理通过这个状态码告知用户,成功获取内容,但是这部分内容和原始服务器的返回内容可能不完全一致。

例如:

HTTP请求Proxy再到Origin Server过程:

  1. 请求:Client ---> Proxy ---> Origin Server.
  2. 源服务器返回内容给代理:Proxy <--- Origin Server:得到内容。例如:index.html
  3. Proxy 有自定义设置,比如:过滤掉一些广告内容,或者移除一些敏感信息 那么原始index.html变为修改后的index.html
  4. 代理返回修改后的内容给客户端:Client <--- Proxy 使用状态码203(Non-Authoritative Information)表示内容和源站的原始内容不一样。

# 204

204 No Content 无内容:服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档

说明

意思等同于请求执行成功,但是没有数据,浏览器不用刷新页面.也不用导向新的页面。

例子:

  1. a标签,如果链接的页面响应码为204,页面也不会发生跳转
  2. 假设页面上有个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>
1
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类似。使用 GETPOST 请求查看

# 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"
1
2
3

# 402

402 Payment Required 需要付款:此响应代码保留供将来使用。创建此代码的最初目的是将其用于数字支付系统,但是此状态代码很少使用,并且不存在标准约定。

# 403

403 Forbidden 拒绝访问:服务器理解请求客户端的请求,但是拒绝执行此请求。可以理解为无权限

# 404

404 Not Found:服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。导致404页面的链接通常被称为断开或死链接,并且可能受到链接形势变化的影响。404 状态代码不表示资源是暂时还是永久缺失。但是,如果资源被永久删除,应该使用 410 而不是 404 状态。

# 405

405 Method Not Allowed 方法被禁止:客户端请求中的方法被禁止。服务器已知请求方法,但已被禁用且无法使用。这两个强制性方法,GETHEAD,绝不能被禁用,不应返回该错误代码。

# 406

406 Not Acceptable 不能接受的:服务器无法根据客户端请求的内容特性完成请求。指示与在其中定义 Accept-CharsetAccept-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"
1
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 需要网络验证

# 九:文章来源

最后更新: 2/9/2023, 7:29:11 PM