HTTP状态码这种标识, 其实是服务器用来给客户端请求做一个标准化的回应。它是由三个数字组成的。当你在这个开发环节里头, 或者去搞运维的时候, 又或者是调试网站的过程中, 碰到了像“页面返回502”这样的情况, 也或者是接口报了401错之类的其他问题。
你的第一步操作, 就是要去确认这个状态码到底是什么意思, 并且要把对应的解决办法找到是什么路径。我们这里提供的那个完整的HTTP状态码分类体系里面, 包含了那个高频码值的速查表, 同时还有那个故障定位的方法。通过这样做, 能够帮你做到在10秒之内就把任意一个状态码的情况给弄清楚明白掉。
状态码分类体系
大家通常把HTTP状态码按照开头的第一个数字划分成五个不同的类别, 这些类别覆盖了所有在标准里面规定的响应情况。
1xx(信息类), 指的是服务器已经接收到了你的请求, 但是还没有处理完毕, 现在正处于在处理的过程当中。在这其中, 最为常见的情况就是101 Switching Protocols, 这个代表的意思是协议切换成功了。
2xx(成功类), 请求被正常地进行受理, 具体的核心码值有200 OK、201 Created以及204 No Content。
当出现3xx代码, 也就是重定向类别的情况时, 意味着请求需要再做一步操作才能把事办完。这里面包含了301码表示永久重定向, 302码表示临时找到位置, 304码表示资源没有被修改过, 以及307码表示临时重定向这几个具体的情形。
4xx(客户端错误类), 这个类别指的是请求本身存在某些问题。
这里的情况要包含那种返回码为400的坏请求, 还有那种返回码是401的未授权访问情形, 同时要提到返回码为403的被禁止情况, 也包括找不到内容的404错误, 还得涵盖方法不被允许的405状态码, 以及可能存在的409冲突问题, 最后还要算上那些因为请求太多而返回429的状态。
当出现5xx(服务器错误类)的时候, 意味着服务端内部发生了异常。具体来说, 这种情况包括了500 Internal Server Error, 也就是内部服务器错误。
还包含502 Bad Gateway, 也就是错误网关。另外还有503 Service Unavailable, 表示服务不可用。最后还有504 Gateway Timeout, 即网关联机超时。
高频状态码速查表
在日常开发的过程中, 人们经常会遇到12个状态码的情况下面是关于这12个状态码的列表, 同时还会提供它们对应的标准释义。
故障定位标准路径
当遇到非200响应时, 请按以下顺序去排查:
1. 确认状态码类别: 当遇到4xx时, 需要优先去检查请求侧, 也就是参数、鉴权还有路径, 当遇到5xx时, 需要优先去检查服务端, 也就是日志、依赖服务以及资源状态。
2. 读取响应体: 标准的服务应该在响应的主体部分里, 去把结构化的错误信息给返回回来, 这些信息就像是一个这样的例子, 里面写着代码是401, 消息的内容是说标记已经过期了, 通过去看这些内容, 就能非常直接地去找到出现问题的原因到底是什么。
3. 核对请求头与状态码匹配性: 比如, 当收到405的时候, 要去检查请求方法是GET还是POST, 看看它是不是跟这个接口里面的定义是一致的。
4. 查看服务端日志的意思是, 当出现5xx这类情况的时候, 必须把后端的日志结合起来看, 才能弄清楚具体是什么异常以及堆栈信息是怎样的。
5. 使用在线工具复现这个操作是这样进行的, 你需要在gname.xin这个平台上去输入目标的状态码, 或者是粘贴完整的请求和响应数据, 然后就会看到工具帮你返回了那个状态码对应的RFC标准定义是什么样子的, 它常见的触发条件有哪些, 还有关联的客户端配置项和服务端配置项都是什么, 并且还会给出对应的修复建议。
补充说明
状态码的定义是以RFC 9110, 也就是名为HTTP Semantics, 在2022年发布的那个文件为准的, 它替代了早期的那个叫做RFC 7231的文件。
401和403之间的核心差异在于含义不同, 具体来说, 状态码401传达的信息是“我没有办法确认你的真实身份”, 这代表了需要对请求者进行验证的过程, 而状态码403所表达的意思是“我已经知晓访问者的具体身份了, 但是该身份并不具备进入当前系统的准许权限”, 这意味着后续处理的关键点转向了对访问资格的审核与授权环节。
301和302这两个状态码的核心区别在于: 301代表的是永久迁移, 意思是要求客户端对地址进行更新, 而302代表的是临时跳转, 意思是要求客户端保留原有的网址。
自定义状态码指的是在部分框架里面是允许大家去注册那些不是标准的代码的, 比如说像是四百五十或者四百五十一这些数字在内, 不过具体的情况是需要依据具体的框架文档的内容来确定的。
等你把上面那些分类的方法, 还有去快速查看的规律都弄明白了之后, 不管遇到什么样的关于HTTP状态码的问题, 都能够直接在30秒这个时间限制之内, 去完成定位。
