HTTP状态码是由三位数字组成的数字代码,用于表示HTTP协议处理请求时的返回状态。状态码通常由服务端发送,客户端通过接收状态码来了解请求是否成功,以及出现错误时出错的原因。
以下是HTTP状态码的详细介绍:
1xx - 信息性状态码
这些状态码表示已接受请求,但仍处于处理过程中。常见的信息性状态码有以下几种:
- 100 Continue(继续):表示客户端应该继续它的请求
- 101 Switching Protocols(切换协议):表示客户端需要采用不同协议以完成请求,如升级为WebSocket
- 102 Processing(处理):表示服务器已经收到并正在处理请求,但客户端仍应继续等待
2xx - 成功状态码
这些状态码表示已成功接收请求并进行了处理。常见的成功状态码有以下几种:
- 200 OK(成功):表示已成功处理请求,一般用于GET和POST请求
- 201 Created(已创建):表示已成功创建请求的资源
- 202 Accepted(已接受):表示已接收请求,但尚未完成处理,需要等待一段时间
- 204 No Content(无内容):表示成功处理请求,但没有返回任何实体内容
3xx - 重定向状态码
这些状态码表示客户端需要可能的进一步操作才能完成请求,如需要进一步地加载新URL。常见的重定向状态码有以下几种:
- 300 Multiple Choices(多项选择):表示请求的资源有多个可供选择的表示形式,由客户端进行选择
- 301 Moved Permanently(永久重定向):表示资源已被永久移除,并且将SE0优化转移到了新的位置
- 302 Found(临时重定向):表示资源已被临时移动到另一个位置和URL
- 303 See Other(查看其他位置):表示客户端应当使用另一个URI来访问请求的资源,而不是使用当前URI
- 304 Not Modified(未修改):表示客户端缓存的资源未发生修改,可以继续使用缓存
- 307 Temporary Redirect(临时重定向):与302状态码类似,客户端应该继续使用原地址
- 308 Permanent Redirect(永久重定向):与301状态码类似,客户端应该使用新的URL来访问请求资源
4xx - 客户端错误状态码
这些状态码表示客户端的请求有错误,需修改请求才能成功。常见的客户端错误状态码有以下几种:
- 400 Bad Request(请求出错):表示请求报文存在语法错误或请求不被服务器所接受
- 401 Unauthorized(未授权):表示请求未经授权,需进行身份验证
- 403 Forbidden(拒绝访问):表示服务器拒绝该请求
- 404 Not Found(未找到):表示请求的资源不存在
- 405 Method Not Allowed(方法不被允许):表示请求中所指定的方法不被服务器支持
- 406 Not Acceptable(不可接受):表示客户端请求的内容格式服务器不支持
- 407 Proxy Authentication Required(需要代理身份验证):表示客户端需要先使用代理服务器进行身份验证才能访问所需资源
- 408 Request Timeout(请求超时):表示请求超时,服务器等待的时间过长
- 409 Conflict(请求冲突):表示请求冲突,且仅适用于PUT请求
- 410 Gone(已被删除):表示请求的资源已被永久删除
- 411 Length Required(需要长度):表示服务端必须提供 Content-Length 头信息
- 412 Precondition Failed(前置条件不满足):表示客户端请求的条件无法服务端满足
- 413 Payload Too Large(请求体太大):表示服务器拒绝处理请求,请求过于庞大
- 414 URI Too Long(URI太长):表示请求中的URI过长,服务器无法处理
- 415 Unsupported Media Type(不支持的媒体类型):表示客户端请求的内容格式不被服务器支持
- 416 Range Not Satisfiable(范围无效):表示服务器无法提供请求的范围,如请求的资源不存在
- 417 Expectation Failed(服务器无法处理Expect头字段指定的期望值):表示服务器无法满足客户端在Expect头字段中指定的扩展请求信息
- 421 Misdirected Request(该对端服务器错):表示服务器要求客户端通过另一个协议或IP地址访问资源,以便更好的控制负载平衡。
- 422 Unprocessable Entity(请求格式正确,但语义有误):表示请求格式正确,但是由于含有语义错误,无法被服务器识别
- 423 Locked(当前请求的资源被锁定):表示由于资源被锁定,请求无法处理
- 424 Failed Dependency(请求失败依赖):表示一个先前的请求失败,导致此次请求失败
- 425 Too Early(请求过早):表示请求过早,任何操作都不能执行
- 426 Upgrade Required(需要升级协议):表示客户端需要切换协议以完成请求
- 428 Precondition Required(此时请求需满足先决条件):表示缺少先决条件,请求无法被处理
- 429 Too Many Requests(请求过多):表示请求次数超出了服务器的限制
- 431 Request Header Fields Too Large(请求头超大):表示请求头部字段或cookie长度过大,服务器无法处理
- 451 Unavailable For Legal Reasons(由于法律原因无法获得):表示服务器由于法律原因无法处理请求
5xx - 服务器端错误状态码
这些状态码表示服务器在处理请求时遇到错误或无法完成请求。常见的服务器端错误状态码有以下几种:
- 500 Internal Server Error(内部服务器错误):表示服务器在处理请求时遇到错误
- 501 Not Implemented(未实现):表示服务器不支持请求的功能
- 502 Bad Gateway(错误网关):表示网关或代理服务器收到无效响应
- 503 Service Unavailable(服务不可用):表示服务器暂时无法处理请求,如服务器过载、停机等
- 504 Gateway Timeout(网关超时):表示网关或代理服务器在规定时间内未能接收到响应
- 505 HTTP Version Not Supported(HTTP协议版本不被支持):表示服务器不支持请求中所用的HTTP协议版本
- 506 Variant Also Negotiates(协商变量也行):表示服务器在内部配置错误
- 507 Insufficient Storage(存储空间溢出):表示服务器无法存储完成请求所必须的内容
- 508 Loop Detected(检测到循环):表示服务器在处理请求时检测到循环
- 510 Not Extended(不可扩展):表示客户端需要进行额外的扩展以完成请求
- 511 Network Authentication Required(需要网络认证):表示客户端需要进行网络认证以完成请求
获取状态码示例
在Java中,使用HttpURLConnection或OkHttp等库发送Http请求,可以通过getResponseCode()方法来获取状态码。下面是一个示例代码:
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int statusCode = connection.getResponseCode();
以上代码是使用HttpURLConnection发送Get请求,并获取响应的状态码。
小结
以上就是HTTP协议中定义的所有状态码及其含义。了解这些状态码,可以更好地判断请求返回结果是否符合预期,有助于开发人员进行debug和问题排查。当HTTP协议定义的状态码不足以表达具体的问题时,HTTP会在响应消息体中进一步描述具体问题信息。无论是服务器端还是客户端,都可以通过状态码及其描述信息来判断问题所在,以便及时得到解决。