HTTP状态码的基本概念
在客户端和服务器连接交互的时候,一般是客户端先给服务器发送请求,然后服务器返回结果。客户端和服务器之间的交互非常频繁,涉及到很多种不同类型的操作,大多数的时候服务器能成功返回结果,有时候也会出错,有的时候还需要重定向,让客户端访问新的地址。
那么服务器是如何通知客户端,操作是成功还是失败?或者有其他的一些情况呢?
答案就是通过HTTP状态码。
HTTP状态码是作为服务器对客户端HTTP请求的响应。它们是一系列标准化的三位数字代码,用于告知客户端请求的处理情况。每个状态码的第一个数字标识了响应的类型。
状态码分类
- 1xx(信息响应):表示服务器收到请求,需要请求者继续执行操作。
- 2xx(成功):表示请求成功,请求被成功接收并处理。
- 3xx(重定向):表示重定向,需要进一步的操作以完成请求。
- 4xx(客户端错误):表示客户端错误,请求包含语法错误或无法完成请求。
- 5xx(服务器错误):表示服务器错误,服务器在处理请求的过程中发生了错误。
HTTP状态码介绍
1xx(信息响应)
状态码 | 英文名称 | 描述 |
---|---|---|
100 | Continue | 服务器已经接收到请求头,客户端应继续发送请求主体。 |
101 | Switching Protocols | 服务器即将切换的协议。 |
2xx(成功)
状态码 | 英文名称 | 描述 |
---|---|---|
200 | OK | 请求成功,响应体随之返回了请求的资源。在浏览器请求网页或API请求数据时常见此状态码。简单来说,它告诉客户端:“你的请求已经成功处理,并且所请求的资源在消息体中。” |
201 | Created | 该请求已成功,并因此创建了一个新的资源。这通常是在 POST 请求,或是某些 PUT 请求之后返回的响应。这个状态码的核心含义是:“你的请求已成功,并且因此创建了一个新的资源。” |
202 | Accepted | 已经接受请求,但未处理完成。 |
203 | Non-Authoritative Information | 非授权信息,表示服务器已成功处理请求,但返回的信息可能来自其他地方,而非原始服务器。 |
204 | No Content | 无内容,服务器成功处理了请求,但不需要返回任何内容。 |
205 | Reset Content | 重置内容,请求已经成功处理,现在应该重置表单,以便用户可以继续输入新的信息 。 |
206 | Partial Content | 部分内容,服务器已经成功处理了部分GET请求。比如断点续传,在下载大文件时,如果下载过程中断,可以从上次中断的地方恢复下载,而不是重新开始。。 |
3xx(重定向)
状态码 | 英文名称 | 描述 |
---|---|---|
300 | Multiple Choices | 多种选择,请求的资源包括多个可选项,客户端应该根据这些选项选择一个进行访问。 |
301 | Moved Permanently | 永久移动,表示所请求的资源已被永久移动到了新的位置,并且将来对此资源的引用应该使用返回的一个或多个URI。这是一种重定向状态码,用于告知客户端资源的新位置。 |
302 | Found | 临时移动,表示请求的资源临时移动到了一个不同的URI,与301不同的是,302表示这种重定向只是暂时的。 |
303 | See Other | 查看其它地址,将客户端重定向到不同的URI,这是对原始请求的响应,但响应本身位于另一个URI。这通常用于在POST请求之后进行,指示客户端向另一个URI发出GET请求以检索操作结果。 |
304 | Not Modified | 未修改,这意味着客户端缓存的版本仍然是最新的,因此不需要重新下载资源,所以客户端只需访问缓存获取数据就行了。 |
305 | Use Proxy | 使用代理,所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向,307状态码与302 Found非常相似,都用于表示资源临时性的重定向到另一个URI。当收到307响应时,客户端应该对新的URI重新发起请求,但是与302不同的是,307保证请求方法和请求体不会改变(例如,POST请求不会变成GET)。这使得307更适合于需要保留请求方法的场景,例如表单提交。 |
4xx(客户端错误)
状态码 | 英文名称 | 描述 |
---|---|---|
400 | Bad Request | 服务器无法理解客户端的请求,因为请求的语法错误或格式不正确。它通常发生在客户端发送了错误的请求数据或格式,如错误的请求行或头部,或无效的请求消息体。 |
401 | Unauthorized | 请求需要用户验证,如果之前已经发送过认证信息,那么401表示认证失败。它通常用于表示客户端尝试访问受保护的资源但没有提供正确的认证证书,如用户名和密码。 |
402 | Payment Required | 保留,将来使用。在未来,它可能会用于数字支付系统。 |
403 | Forbidden | 服务器理解了客户端的请求,但是拒绝执行。这通常是由于服务器上的访问控制规则造成的,比如客户端没有足够的权限访问特定的资源。 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。 |
405 | Method Not Allowed | 客户端请求中的方法被禁止,这个状态码表示服务器已经识别了请求的方法(如GET、POST、PUT等),但该方法对于请求的资源是禁用的。例如,尝试用POST方法访问一个只允许GET请求的URL。 |
406 | Not Acceptable | 服务器无法生成客户端在请求的Accept头中指定的内容特性响应。例如,客户端请求JSON格式的数据,但服务器只能提供XML格式。 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,类似于401,但是指出客户端必须先在代理服务器上进行认证。 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时。 |
409 | Conflict | 表示请求与服务器当前状态冲突,例如多个同步更新之间的编辑冲突。 |
410 | Gone | 请求的资源已被永久删除,不再可用。与404不同,410指明这是一个已知的条件,资源以前是存在的。网站设计人员可通过301代码指定资源的新位置。 |
411 | Length Required | 服务器拒绝不含有效内容长度(Content-Length)头的请求。某些服务器配置要求必须知道请求的大小。 |
412 | Precondition Failed | 客户端在其请求中设置的前提条件失败。例如,客户端可能发送了“If-Match”请求头来基于特定版本的资源进行更新,但是资源的当前版本与客户端的不匹配。 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,超出了服务器愿意或能够处理的范围。 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理。 |
415 | Unsupported Media Type | 请求附带的媒体格式,服务器无法处理。 |
416 | Requested range not satisfiable | 客户端在请求中指定的Range头无法满足,可能是请求的范围超出了目标URI的数据大小。 |
417 | Expectation Failed | 服务器无法满足Expect请求头中的期望。例如,当客户端在其HTTP请求头中设置了“Expect”头字段,它可能包含了一个特定的预期,例如“100-continue”,表示客户端希望在发送请求的主体之前得到服务器的确认。如果服务器无法满足这个预期,或者不理解请求头中的“Expect”字段,它会返回417 Expectation Failed状态码。 |
5xx(服务器错误)
状态码 | 英文名称 | 描述 |
---|---|---|
500 | Internal Server Error | 服务器内部错误,无法完成请求。500错误是一个“服务器端”错误,意味着问题出在服务器上,而不是客户端请求有误。这可能是由于服务器程序错误、配置问题或资源不足导致。 |
501 | Not Implemented | 服务器不支持当前请求所需的功能。当服务器不识别请求方法,并且无法支持其对任何资源的处理时,就会返回这个状态码。比如,客户端发送了一个服务器不识别的自定义请求方法。 |
502 | Bad Gateway | 服务器作为网关或代理,从上游服务器收到无效响应。502错误表明你正在访问的服务器是一个网关或代理服务器,而它在处理请求时从上游服务器或辅助服务器接收到了无效的响应。 |
503 | Service Unavailable | 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是暂时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个Retry-After头用以标明这个延迟时间。如果没有给出这个Retry-After信息,那么客户端应当以处理500响应的方式处理它。 |
504 | Gateway Time-out | 作为网关或代理的服务器未能在允许的时间内从上游服务器(或辅助服务器)接收请求。504错误与502错误相似,但区别在于502错误表明无效响应,而504错误是由于响应超时。 |
505 | HTTP Version not supported | 服务器不支持或拒绝支持在请求中使用的HTTP协议版本。 |
常见的HTTP状态码解析
200 OK
看到“200 OK”就表示请求成功了,并且服务器端的内容已经正常返回。
304 Not Modified
表示服务器上的资源未修改,这意味着客户端缓存的版本仍然是最新的,因此不需要重新下载资源,所以客户端只需访问缓存获取数据就行了。
400 Bad Request
服务器无法理解客户端的请求,因为请求的语法错误或格式不正确。它通常发生在客户端发送了错误的请求数据或格式,比如下图,在应该填写时间的地方填了一大串数字。
404 Not Found
服务器无法根据客户端的请求找到资源(网页),通常是客户端发送给服务器的URL写错了。
我们上网的时候输错网址,经常能看到“你访问的页面不存在”。
500 Internal Server Error
服务器内部错误,无法完成请求。500错误是一个“服务器端”错误,意味着问题出在服务器上,而不是客户端请求有误。这可能是由于服务器程序错误、配置问题或资源不足导致。
下图是因为用户输入的金额太大,超过数据库字段定义的长度,导致服务器上的程序出错了。
最后
HTTP 状态码能够非常清楚地描述服务器的当前状态,用来提示客户端下一步的操作。
除此之外,HTTP 状态码还有一个作用,就是能有效防止程序员同学们甩锅,当系统出现一个bug的时候,他们第一反应大概率是:这肯定不是我写的代码出问题了。
但是,如果服务器返回4xx错误,那大概率就是前端同学的锅,前端同学就要第一时间介入;如果服务器返回5xx错误,就可以理直气壮地找后端同学解决问题了。
好了,今天就先讲到这里,我们下次再见。
参考资料:
HTTP 响应状态码 - HTTP | MDN (mozilla.org)
HTTP状态码 - 维基百科,自由的百科全书 (wikipedia.org)
HTTP 状态码 | 菜鸟教程 (runoob.com)
rfc7231