请求与响应 格式规范探讨(一)

718 阅读4分钟

0、背景

概述

某次前端周会时讨论过三个问题。

一是代码风格的问题,二是与后端对接时接口的问题,三是监控的问题。

  • 代码风格上,我们希望整个项目看上去大体的风格是统一的,但是又希望每个人都有自由发挥的空间。

  • 而在与后端对接的接口上,我们希望 :

    • 不无限制地增加新接口

    • 接口数据格式统一,不需要前端去做(增加)额外的“抹平”。

  • 监控方面,目前上报的jsError很多,但真正有用的很少,且同一自定类别的上报信息中混杂着多种错误信息,难以分类。

因此,本文为 对发出请求到响应请求过程中的部分问题 的探讨思考,希望能对解决上述问题提供帮助。

目标

梳理代码层面从发出请求到响应请求的整个流程,探讨各步骤可行的(改进)方案,推进实现以下目标:

  • 统一项目的大体风格,降低接手理解难度;
  • 确认接口数据格式规范,减少修改公共代码的“需求”;
  • 限制接口数量膨胀速度;
  • 将网络错误与业务错误隔离,方便错误分类统计。

方案

  • 引入 RESTful 风格
  • 探讨、约定 请求及响应的参数格式
  • 对请求和响应进行拦截/代理 加工

1、接口URL设计

可选风格

  1. 文件路径式。一个路径对应一个资源。
  2. MVC。根据URL找到对应的控制器和行为;行为调用相关的模型,进行数据操作;数据操作结束后,调用视图和相关数据进行页面渲染,输出到客户端。
    1. 手工映射。手动配置URL对应的逻辑(控制器)。可以通过正则来匹配路径和解析参数。
    2. 自然映射。将路径部分也当成参数来处理解析。
  3. RESTful ((Resources) Representation State Transfer)。
    1. 在MVC的基础上,加入了HTTP方法。URI中不带动词,全部是名词。基础动作通过post、get、put、patch、delete来区分。

对比:

风格 直观程度 灵活性 需要定义的接口数量
文件路径式
MVC
RESTful

现状:

主要使用的还是MVC手工映射的方式。 可引入RESTful。引入的影响:

  1. 接口数量减少,更易于维护。
  2. 可能需要通过post来模拟delete、put、patch
  3. 其他待掘友补充

2、请求相关问题

请求参数

什么时候传字符串,什么时候传对象、数组?

  • 之前碰到过要求将某一个参数值(对象类型)转换成字符串后,再和其他参数一起传给后端。这种情况下怎么处理比较好呢?

日期形式?

  • 不同语言前台和后台获取到的date格式不同,而时间戳都是一样的,所以统一传时间戳是个不错的选择。

更新时是否只传更新的内容(除id之类关键字段外)?

  • 一般情况只传更新的内容更好。
  • 特殊情况就是嵌套较多、较深时,只取更新的内容比较麻烦。应尽量避免这种情况。

请求拦截/代理

统一添加 host (部分项目中由于同一环境下有多个不同的域名,因此无法统一添加host)

添加公共参数

错误处理

  • 错误上报信息?
  • 是否重发?
  • 取消遮罩

loading遮罩

  • 默认不加。
  • 在需要禁止用户操作时添加
  • 表格数据加载时,仅加 loading 动画,不加遮罩

3、响应相关问题

状态码

  • GET: 200 OK
  • POST: 201 Created
  • PUT: 200 OK
  • PATCH: 200 OK
  • DELETE: 204 No Content
  • 。。。

目前的情况是,只要接口是通的,即使请求失败了(业务错误),返回的状态码都是200。个人比较赞同当前方案。

响应参数

目前各业务需求不同,参数风格也不统一(尤其是在接手其他团队的业务时),发展到现在也很难统一。

推荐基础格式:

参数 参数名称 是否必填 参数类型 参数说明
status 请求结果状态 Integer 成功、失败、未登录等
error 错误信息 Object / String 错误信息复杂时,为Object
data 业务数据 Object 仅当status返回的状态码表示成功时必填
其他 业务数据 基础数据类型 当有两条以上数据时,请使用data

表格数据:

  • 无数据时传空数组,若有翻页,则同时返回total为0

响应拦截/代理

隐藏 loading动画及遮罩

对不同的数据格式进行抹平

错误处理

  • 响应失败 - 请求超时,此时无响应状态码,中止错误传递,监控上报请求信息
  • 客户端、服务器错误,状态码为 4xx、5xx时,中止错误传递,监控上报,这类问题主要会在联调阶段出现。
  • 正常错误。主要是信息校验不通过,将错误信息通过 reject 传递到具体页面进行处理、上报。
  • 对于正常业务错误 统一提示。