外观
常见 HTTP 状态码怎么用?
2xx 表示成功,3xx 表示还要再走一步,4xx 是客户端问题,5xx 是服务器没完成。接口设计要让状态码表达结果,不要所有失败都返回 200 再在 JSON 里塞一个错误码,除非这是团队已经统一的约定并且网关认。
原理
200成功并带有正文。201已创建。204成功但没有正文。301永久移动,方法和正文在历史上可能被改成 GET。302临时移动,也常被改成 GET。需要保持方法和正文时用307(临时)或308(永久)。304协商缓存未修改,不是错误。400请求语法或参数不合法。401没认证。403已认证但没权限。404资源不存在。409冲突。429请求太多。500服务器异常。502网关从上游拿到了无效响应。503暂时不可用。504网关等上游超时。
401 和 403 不要混。没登录是 401,登录了但不能做是 403。不要用 404 隐藏所有无权限资源,除非产品明确要求不暴露资源是否存在。
追问
前端要怎么分支?
先看 HTTP 状态,再解析业务正文。fetch 不会因为 4xx、5xx reject。重试只适合幂等请求和 429、503 这类暂时失败,并且要限制次数和间隔。
301 缓存在浏览器里会怎样?
永久重定向可能被浏览器记住。配错之后很难靠改服务器立刻纠正所有旧客户端。临时迁移用 302 或 307。
易错点
- 把
304当失败。 - 所有接口返回 200,监控和 HTTP 缓存都无法判断失败。
401和403互换,前端会错误地跳登录页。