LESSON 5.4 / BACKEND & API

输入校验、错误处理与接口契约

接口不能假设输入总是正确。校验负责拒绝不合格数据,错误契约让前端知道发生了什么以及怎样提示用户。

预计阅读约 25 到 40 分钟
完成结果新增任务接口对正常、缺字段和格式错误三类输入给出稳定且可区分的响应。
本课目标
  • 新增任务接口对正常、缺字段和格式错误三类输入给出稳定且可区分的响应。
  • 类型、必填字段、长度与业务规则校验
  • 检查输入校验、错误处理与接口契约后,应当新增任务接口对正常、缺字段和格式错误三类输入给出稳定且可区分的响应,并保留状态码、响应结构、进程输出和前后端同一次请求作为可重复检查的依据。
开始之前
  • 完成 5.3「写出第一个后端接口」
01

FOUNDATION

必须理解

接口契约让前后端对字段和错误达成一致;输入校验保护业务边界;错误处理把失败变成可理解、可恢复的信息。三者共同决定联调是否稳定。

本课依次讲清类型、必填字段、长度与业务规则校验、400、401、403、404、409、500 的职责和稳定错误结构、日志和用户提示的差异,最后通过“逐一调用五种场景并比较契约与实际响应”检查学习结果。

先建立整体直觉

快递面单规定姓名、地址和电话格式;缺字段时工作人员不会把包裹随便寄出,而会指出哪项有问题。内部传送带故障也不会把机器细节写给顾客。

贯穿本课的实际场景

创建任务要求 title 为 1 到 80 个字符,成功返回 Task,校验失败返回字段错误,服务器异常返回通用信息并在日志保留细节。

概念 1

类型、必填字段、长度与业务规则校验

先用白话理解

校验会检查类型、长度、格式和业务规则。去掉标题首尾空格通常没问题,但不要在用户不知情时把内容改成另一种意思。

基础概念

输入校验是把外部数据与明确规则比较,包括类型、必填、长度、格式、取值范围和业务条件。只有全部满足后,数据才能进入核心逻辑。

进一步理解

类型与格式回答“长得对不对”,业务规则回答“在当前状态下允不允许”。例如标题是字符串仍可能过长,日期格式正确仍可能早于项目开始。

规范化可去除无意义差异,如首尾空格;但不能悄悄改变用户真实含义。校验错误应指向具体字段与可修复原因。

放进实际场景

创建任务先确认 body 是对象、title 是 1 到 80 个字符,再确认同一项目没有违反唯一规则,最后才写数据库。

容易混淆的地方

校验不是清洗一切输入,也不是安全的全部。权限、参数化查询和输出编码仍属于其他防线。

这一小节记住:在可信逻辑开始前,把数据形状与业务边界明确检查一遍。

概念 2

400、401、403、404、409、500 的职责

先用白话理解

接口契约就是前后端共同遵守的约定:用什么方法、发哪些字段、成功和失败分别长什么样。字段一改,两边都要知道。

基础概念

HTTP 400 表示请求无效,401 表示尚未认证,403 表示身份已知但无权操作,404 表示资源不存在,409 表示状态冲突,500 表示服务端意外失败。

进一步理解

状态码让调用方先判断失败类别,错误正文再给稳定代码、用户消息和可选字段细节。不同错误应保持语义一致,不能全部返回 200。

有时出于安全考虑,服务端会用 404 隐藏资源是否存在;这是明确策略,不是随意混用。500 响应给用户通用信息,内部日志保留请求标识与详细原因。

放进实际场景

未登录创建任务返回 401;登录但编辑他人任务返回 403 或策略化 404;重复唯一标题返回 409;数据库异常返回 500。

容易混淆的地方

401 不等于“权限不够”,403 也不等于“没登录”。状态码选择影响前端是引导登录、提示无权还是允许重试。

这一小节记住:用状态码表达失败类别,用稳定正文帮助调用方采取下一步。

概念 3

稳定错误结构、日志和用户提示的差异

先用白话理解

400 多半是请求本身有问题,401 和 403 与身份权限有关,404 是没找到资源,409 是冲突,500 则是服务端意外。给用户的错误要稳定,也别把堆栈和秘密直接吐出去。

基础概念

错误结构是程序之间的稳定契约,日志是维护者调查内部过程的证据,用户提示是面向当前任务的可理解说明。三者受众不同,信息量也不同。

进一步理解

响应可包含 `code`、`message`、`fieldErrors` 和 `requestId`;日志则记录异常类型、操作上下文和堆栈,但要脱敏。界面根据 code 决定聚焦字段或展示重试。

不要把原始数据库错误直接交给用户,也不要只在界面写“失败”。前者泄露内部,后者让用户无法恢复。请求 ID 可以安全地连接两类信息。

放进实际场景

标题过长时响应指出 title 限制,界面把提示放到输入框旁;数据库故障只显示“暂时无法保存”,日志用 requestId 记录根因。

容易混淆的地方

错误 message 适合人看,code 适合程序判断;把界面逻辑绑定完整中文句子会让文案调整破坏行为。

这一小节记住:同一次失败,为调用方、用户和维护者提供各自需要的信息。

02

AI COLLABORATION

AI 如何参与

在输入校验、错误处理与接口契约这一课,AI 负责根据真实材料解释类型、必填字段、长度与业务规则校验并指出遗漏,学习者负责控制范围、执行修改和核对状态码、响应结构、进程输出和前后端同一次请求。

推荐协作顺序

  1. 1

    把字段限制和错误结构告诉 AI,让它先列完整场景表。

  2. 2

    逐条检查状态码、错误 code 和用户提示是否一致。

  3. 3

    用边界输入实际调用,确认实现没有只照顾示例数据。

可直接使用的 Prompt
这是接口输入模型和现有响应。请先列出可验证规则,再设计最小错误结构。错误信息不得包含堆栈、SQL、路径或秘密。为每条规则给正常与失败请求,并说明前端如何展示。
应该得到什么

前端可以依据状态码和稳定错误 code 呈现反馈,服务端异常不暴露内部路径或堆栈;输入校验、错误处理与接口契约的人工验收必须回到真实页面、请求、终端、测试或数据结果,不能用 AI 的文字说明代替。

人工检查清单

  • 确认校验发生在服务端,客户端校验只是体验优化;状态码与含义一致。
  • 要求 AI 为正常、缺失、越界、冲突、未授权和内部失败分别给出输入与预期响应。
  • 亲自发送每类请求,确认状态码、错误结构、界面提示和日志内容相互对应且已脱敏。
03

COMMON TRAPS

常见误区

下面三类问题会让任务看似完成,却经不起刷新、错误输入或真实环境检查。先看现象,再找原因和修正方法。

误区 1

只在前端校验

你会看到
绕过页面即可提交错误数据
为什么发生
调用者可以绕过页面直接发请求,服务端仍会收到未经检查的数据。
怎样纠正
服务端再次执行权威校验
误区 2

所有错误都返回 200

你会看到
前端难以区分成功与失败
为什么发生
状态码失去语义后,客户端、监控和缓存都难以区分成功与失败。
怎样纠正
使用合适状态并保持正文结构
误区 3

把堆栈返回给用户

你会看到
内部路径和实现细节暴露
为什么发生
堆栈含有文件路径和内部实现,既难帮助用户,也扩大信息暴露。
怎样纠正
详细信息写日志,响应保持安全
04

HANDS-ON

动手任务

新增任务接口对正常、缺字段和格式错误三类输入给出稳定且可区分的响应。

准备条件
  • 完成 5.3「写出第一个后端接口」

跟着做

  1. 01

    为任务创建写出字段表和限制。

  2. 02

    定义统一成功与错误 JSON。

  3. 03

    在 Route Handler 中实现类型、空值与长度校验。

  4. 04

    前端根据 field 显示输入框错误。

  5. 05

    逐一调用五种场景并比较契约与实际响应。

完成标志

新增任务接口对正常、缺字段和格式错误三类输入给出稳定且可区分的响应。

加餐挑战

加入幂等或冲突场景:相同请求重复提交时,决定产品应该创建两条还是返回冲突。

离开本课前,自问四件事

  • 类型、格式和业务规则校验有什么不同?
  • 400、401、403、404、409、500 各自表达什么?
  • 稳定错误结构、用户提示和内部日志为何不能使用同一内容?
  • 怎样让一条错误既能被前端处理,又能被维护者追踪?
完成本课了吗?

确认完成后,会同步更新学习中心的课程学习进度。