返回知识库

数据与服务 · 网络与接口

客户端错误4xx Error

4xx 表示服务器已响应,但客户端请求不满足条件。读状态码和错误契约,修改字段、身份、资源目标或发送节奏;原样重发通常还会失败。

创建项目:409 后先改请求,再提交

你正创建项目 atlas。服务器不是没回应,而是告诉你名称已被占用。只用一个修复动作,让同一份项目创建从冲突变为成功。

PROJECTS / NEWPOST /api/projects
同一份创建请求会带上这个 name。
尚未提交

创建 atlas,看看服务器如何拒绝一个冲突请求。

操作 0/3:请求还未发送。

4xx 的核心:响应到了,问题在客户端这一侧

4xx 不是网络断开:你拿得到状态码和错误契约。多数情况要修改字段、身份、目标资源或发送节奏;原样重试没有新信息。

字段 / 语义400 请求格式错;422 格式对但字段语义不通过保留输入,标红对应字段并让用户修复
身份 / 权限401 未认证或凭证过期;403 已认证但无权401 登录后带回意图;403 停止重试、解释权限
资源状态404 查无资源;409 与当前状态冲突;410 已永久移除给返回入口、换名或读取最新版本
发送过密429 Too Many Requests,通常带 Retry-After等待并退避重试;它是少数例外

离开后记住:4xx 要让客户端修复请求;只有 408 超时、429 限流通常值得受控重试。服务端故障则应是 5xx。

落地:状态码分流,error.code 定位到具体动作

不要把所有失败都做成 200 + success:false,也不要把用户填错字段返成 500。让 HTTP 层和页面层都能正确处理。

{ "error": { "code": "name-taken", "message": "项目名已被占用", "details": { "field": "name" } } }

客户端先根据 status 选处理分支,再用稳定的 error.code 把 details.field 对应到输入框或恢复入口。401 与 403 文案要分开,429 必须尊重 Retry-After。

同一任务的正反例

创建项目时,语义化 409 能把用户带向正确恢复动作;原样重发只会制造同一次冲突。

正例:409 + name-taken

页面保留 atlas,指出 name 字段并给出换名入口。用户改为 atlas-notes 后获得 201。

反例:把 atlas 原样重发

请求体没有变化,资源状态也没有变化;服务器仍会返回 409。等待不会让同名冲突自动消失。

快速自测

创建项目收到 429 和 Retry-After: 30,下一步最合适的是?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。