HTTP 协议状态码-4XX
4XX 的状态码指的是请求出错了,而且很有可能是客户端侧的异常。客户端侧的异常很多,有时候情况也比较复杂,下面定义的状态码有时候也只能反应一个大概情况,而不一定确切的。
400 Bad Request
作为客户端异常的首个状态码,400
代表的意思很泛(错误的请求),一般指的是 4XX
其它状态码没有更合适的情况下就用 400
,毕竟客户端出错类型很多,无法准确把情况都定义好。
401 Unauthorized
请求没有权限,通常返回的响应头部会包含 WWW-Authenticate 的头,浏览器遇到这种响应一般会弹出一个对话框,让用户重新提交用户名和密码进行认证。
服务端响应
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic; realm="Secured area"
客户端重新提交认证
GET / HTTP/1.1
Authorization: Basic j3VsbCBkb25lOnlvdhBmb3Vu89B0aGUgZWFzdGVyIoUnZwo=
402 Payment Required
这是一个预留的状态,最初想要实现的是,一些商业网站,用户付费完后可以重复的发送请求,为支付而预留的。
403 Forbidden
访问被禁止了,401
确切指没有认证,403
范围就更多了,可能是登陆了但是没有这个资源的权限,可能是访问的源 ip
不在相应的白名单中,等所有不被允许的情况。
404 Not Found
很常见的一种错误码,可能是你的地址构造错了,也可能是后台服务器的资源确实没了。
405 Method Not Allowed
请求方法有 POST
GET
这类,客户端访问的方法跟服务端能够提供的不一样,当请求状态是 405
的时候,响应信息头会带上 Allow
字段,告诉客户端被允许的请求方法是哪些。
HTTP/1.1 405 Method Not Allowed
Content-Type: text/html
Allow: GET, HEAD, OPTIONS, PUT
406 Not Acceptable
指定的资源已经找到,但它的媒体类型和客户在Accpet头中所指定的不兼容,客户端浏览器不接受所请求页面的媒体类型。
客户端请求一个 Json 格式内容
GET /foo HTTP/1.1
Accept: application/json
Accept-Language: fr-CA; q=1, fr; q=0.8
服务端不支持 Json
HTTP/1.1 406 Not Acceptable
Server: curveball/0.4
Content-Type: text/html
407 Proxy Authentication Required
要求进行代理身份验证,类似于401,表示客户必须先经过代理服务器的授权。
代理服务器返回需要认证的状态
HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic; realm="Secured area"
客户端发起代理认证
GET / HTTP/1.1
Proxy-Authorization: Basic d2VsbCBkb25lOllvdSBmb3VuZCB0aGUgc2Vjb25kIGVhc3RlciBlZ2cK
原站需要认证,代理服务器也需要认证的情况
GET / HTTP/1.1
Proxy-Authorization: Basic ZWFzdGVyIGVnZzpudW1iZXIgdGhyZWUK
Authorization: Bearer c2VuZCBtZSBhIHR3ZWV0IG9yIHNvbWV0aGluZwo
408 Request Timeout
客户端太慢了,超出了服务端允许的等待时间,服务端会返回 408
并断开连接。常见的有可能网速太慢了,一个请求发送太长时间还没发完。
HTTP/1.1 408 Request Timeout
Connection: close
Content-Type: text/plain
Too slow! Try again
409 Conflict
客户端请求本身没问题,但是服务端对应的资源跟客户端要执行的操作有冲突。比如客户端要修改 版本1的某个资源,但是服务端着个资源只有在 版本2 才存在。
410 Gone
告知客户端某个资源不存在了,跟 404
很像,只是 410
更加明确该资源永久性改变了,如果客户端在许可的条件下,应该把所有指向着个地址的连接全部删除。404
就比较笼统,当前请求的资源不在了,不清楚后面会不会有。
410
响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。
411 Length Required
服务器拒绝在没有定义 Content-Length 头的情况下接受请求。
412 Precondition Failed
请求头部带有一些先前条件,满足了才可以执行,不满足就返回 412
。常见的就是要求某个资源过期了才能修改,不过期的时候执行 PUT
修改就报错。
413 Request Entity Too Large
服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。
414 Request-URI Too Long
请求的 URI
长度超过了服务器能够解释的长度,这种情况比较可能的是 GET
请求的 URI
携带的参数太多太大了。
415 Unsupported Media Type
请求实体的媒体类型不被服务器或者资源支持。例如,客户端想要返回一个 application/json
内容,服务端只能提供 text/html
类型的资源。
416 Requested Range Not Satisfiable
服务器不能满足客户在请求中指定的Range头。
417 Expectation Failed
在请求头 Expect 中指定的预期内容无法被服务器满足。
418 I’m a teapot
IETF 在愚人节的时候发布了一个 笑话的 RFC 提案,内容是:当客户端给一个茶壶发送泡咖啡的请求时,茶壶就返回一个418错误状态码,表示“我是一个茶壶”。后来官方想要去除该编号,竟然遭到了阻止,甚至不少浏览器都支持这个协议。是技术圈中一个错误而美好的典故。
421Misdirected Request
请求被指向到无法生成响应的服务器(比如由于连接重复使用)
422 Unprocessable Entity
请求格式正确,但是由于含有语义错误,无法响应。(RFC 4918 WebDAV)
423 Locked
当前资源被锁定。(RFC 4918 WebDAV)
424 Failed Dependency
由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。(RFC 4918 WebDAV)
425 Too Early
服务器不愿意冒风险来处理该请求,原因是处理该请求可能会被“重放”,从而造成潜在的重放攻击。
426 Upgrade Required
客户端应当切换到TLS/1.0。
449 Retry With
代表请求应当在执行完适当的操作后进行重试。
451 Unavailable For Legal Reasons
该请求因法律原因不可用。