页面保留 atlas,指出 name 字段并给出换名入口。用户改为 atlas-notes 后获得 201。
创建项目:409 后先改请求,再提交
你正创建项目 atlas。服务器不是没回应,而是告诉你名称已被占用。只用一个修复动作,让同一份项目创建从冲突变为成功。
同一份创建请求会带上这个 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。等待不会让同名冲突自动消失。
快速自测
创建项目收到 429 和 Retry-After: 30,下一步最合适的是?
继续查证
术语的技术定义和行为以这些一手或权威资料为准。
下一步学
和本知识点经常一起出现的概念。