返回专题首页

JavaScript 专题

与服务端协作:接口契约、状态码、错误码、分页结构与鉴权流程

JavaScript 进入真实业务后,很快就会碰到一个事实:前端能做的很多事情,最终都要和服务端协作完成。页面展示的数据来自接口,用户操作会触发写请求,权限判断依赖鉴权,列表要处理分页,错误提示离不开统一的错误语义。也就是说,前端并不是“拿来一个接口调一下”这么简单,而是在参与一

JavaScript 专题第 16 篇 / 25 篇6 分钟

JavaScript 进入真实业务后,很快就会碰到一个事实:前端能做的很多事情,最终都要和服务端协作完成。页面展示的数据来自接口,用户操作会触发写请求,权限判断依赖鉴权,列表要处理分页,错误提示离不开统一的错误语义。也就是说,前端并不是“拿来一个接口调一下”这么简单,而是在参与一套完整的前后端契约。

这一篇的重点,是把这种协作关系讲清楚。你需要知道:为什么接口设计会直接影响前端复杂度,状态码和错误码为什么不能混着看,分页结构为什么很能暴露系统设计习惯,鉴权为什么不是“有 token 就行”。

什么叫接口契约?

接口契约指的是前后端对请求和响应达成的明确约定,包括路径、方法、参数结构、字段命名、状态表达、错误格式和边界行为。契约清晰时,前端可以稳定消费数据,后端也知道自己的改动会影响哪里;契约模糊时,双方就会不断用“猜”和“补丁”维持协作。

很多项目之所以前端代码复杂,不是页面逻辑真的多,而是接口契约不稳定。字段一会儿叫这个、一会儿叫那个;成功响应和失败响应长得完全不同;分页有时返回总数有时不返回;权限失败和业务失败混成一团。前端最终只好写大量适配逻辑。

状态码和错误码为什么必须分层理解?

HTTP 状态码解决的是协议层语义,例如请求是否成功到达、资源是否存在、权限是否允许;业务错误码解决的是应用层语义,例如用户名已存在、库存不足、参数校验失败。两者都重要,但职责不同。

如果把它们混为一谈,前端就很难做稳定处理。比如:

  • 协议层失败通常意味着网络或认证问题;
  • 业务层失败则往往需要用户层面的提示和交互处理;
  • 某些错误可以重试,某些不能;
  • 某些错误应该跳登录,某些只该提示表单字段。

前端真正要做的是分层消费,而不是把所有失败都弹成“请求出错”。

分页结构为什么能看出接口是否好用?

列表是后台和内容系统最常见的页面形态,所以分页结构会高频出现。一个成熟的分页接口通常不仅返回数据列表,还会返回当前页、页大小、总数、是否有下一页等信息,让前端能稳定地组织表格、分页器、滚动加载和空态展示。

分页之所以重要,是因为它暴露了协作质量。结构清晰时,前端列表逻辑可以非常稳;结构混乱时,分页状态往往散落在各处,改筛选、跳页、重置条件时就容易出错。

联调为什么总会把接口问题放大?

因为前后端在本地各自开发时,很多问题还处在“各自合理”的状态,真正联到一起时才会暴露冲突。例如前端默认某字段一定返回,后端却在空值时省略;前端以为翻页参数是 pagepageSize,后端却按 currentsize 接;前端按 HTTP 状态码判断登录失效,后端却统一返回 200 再给业务码。

所以联调阶段真正重要的不是“赶快把页面调通”,而是借这个阶段把接口契约收敛下来。越早推动统一,后面前端业务代码里的补丁就越少。

鉴权流程为什么不能只看 token 存哪儿?

很多人一谈鉴权,就只关注“token 放 cookie 还是本地存储”。这当然是其中一部分,但真正完整的鉴权流程要看更多环节:

  • 登录成功后身份信息如何下发;
  • 请求时身份如何附带;
  • 失效时怎样处理;
  • 刷新页面后如何恢复会话;
  • 权限不足是前端拦还是服务端拒;
  • 多标签页、退出登录和过期刷新如何协同。

这说明鉴权是前后端共同维护的一条链路,而不是前端自己持有一个字符串就结束。

复杂业务里最容易忽略哪几类协作边界?

除了最显眼的登录和列表,复杂业务里还有几类边界特别容易被低估:

  • 表单提交失败后,哪些字段级错误由后端返回、哪些由前端本地校验;
  • 上传、导出、长任务轮询这类接口,状态推进由谁主导;
  • 乐观更新后失败回滚时,前端是否有足够信息恢复现场;
  • 权限按钮是否只靠前端隐藏,还是服务端也做强校验。

这些问题如果不提前约定,前端最后往往只能在组件里堆很多临时兼容逻辑。

前端在协作中最该主动推动什么?

成熟的前端协作,不只是被动适配接口。很多时候,前端应该主动推动几个方面:

  • 字段命名和结构保持一致;
  • 错误响应格式统一;
  • 分页和筛选参数有清晰规范;
  • 鉴权失败和权限不足有明确区分;
  • 空值、默认值和边界行为提前约定。

这样做不是“越权设计后端”,而是在减少整个系统的联调成本。

一个成熟的前端消费层通常会怎么分层?

为了避免请求逻辑和业务页面紧耦合,成熟项目通常会把接口消费分成几层:

  • 请求层:统一处理基础请求、超时、鉴权附带和协议层错误;
  • 适配层:把后端返回的字段结构整理成前端更稳定的数据形态;
  • 页面层:只关注加载态、空态、交互状态和业务展示。

这种分层的价值在于,后端接口偶尔波动时,不需要每个页面都跟着改;同时页面代码也不会被状态码、错误码和字段兼容细节淹没。

常见误区

这一章常见问题包括:

  • 认为前端只负责调用接口,不需要关心契约设计;
  • 把状态码和业务码混在一起处理;
  • 分页结构设计随意,列表逻辑越来越碎;
  • 只关注 token 存储,不关注完整鉴权链路;
  • 碰到后端返回不一致就直接在前端加兼容补丁,不推动收敛。

和后续章节的关系

下一篇我们会进入 AST 与自动化,看 JavaScript 除了写业务之外如何参与工具和代码改造。这里的服务端协作,则是 JavaScript 进入业务系统最关键的一条现实主线。

写在最后

真正成熟的前端,不是把接口请求包起来就结束,而是能看懂并推动更稳定的协作边界。接口契约、错误分层、分页结构和鉴权流程看似琐碎,实际上直接决定前端代码会不会越写越乱。下一篇我们把视角从业务协作再往外扩,进入 JavaScript 的自动化能力。