# 数据交互格式标准

服务端与前端及手机移动端数据交互标准格式详细说明

内容目录

# 数据格式样例





















































 











 







{
  /**
   * 请求结果状态码
   *
   *  0: 请求成功,数据正常返回
   *  9xx: 身份认证授权相关,系统预留异常状态
   *  其他状态码(4-6位):业务检查不通过
   */
  "code": number,
  /**
   * 请求异常的提示信息
   *
   * 业务检查不通过示例
   * {
   *   "code": 10086,
   *   "msg": "您的电话号码异常!",
   *   "data": {}
   * }
   *
   * 网站/管理平台请求成功的示例
   * {
   *   "code": 0,
   *   "msg": "ok",
   *   "data": {
   *     业务数据
   *   }
   * }
   * 手机客户端请求成功的示例
   * {
   *   "code": 0,
   *   "msg": "用户订单更新成功!",
   *   "data": {
   *     业务数据
   *   }
   * }
   */
  "msg": string,
  /**
   * 请求后返回的数据内容都应在 data 节点下输出
   * data 节点的数据类型必须为 object 类型
   */
  "data": {
    // 常规单一数据节点
    "attr": value,
    // 对象数据节点
    "user": {
      "name": "zhangsan",
      "age": 18
    },
    // 列表型数据节点
    "users": [{ object }, ...],
    // 数据表格查询结果输出的专用数据节点
    "grid": {
      // 总记录数
      "total": number,
      // 数据列表内容
      "list": [
        {
          object // 数据模型
        },
        { ... }
      ]
    },
    // 用户登录、更新/刷新 token 等登录授权操作后输出的专用数据节点
    "access": {
      "accessToken": string,
      "refreshToken": string,
      "expiresIn": number
    }
  }
}

# 数据输出的固定结构

除文件流输出等特殊情况下,数据接口请求都应返回以下数据结构

{
  "code": number,
  "msg": string,
  "data": object
}

# 部分场景说明

  • 请求成功
{
  "code": 0,
  "msg": "ok",
  "data": object
}

网站/管理平台 在数据接口请求成功的场景下,msg 字段固定输出 ok 文本内容

手机客户端 在进行人机交互场景,需要提示信息时,相关文本内容均来自 msg 字段,若无文本输出需求,同样默认输出 ok 文本内容

  • 请求失败
{
  "code": 10086,
  "msg": "您的电话号码异常!",
  // 固定输出空对象 {}
  "data": {}
}

# 状态码

请求结果状态码按照大类来划分,分为 成功系统预留异常业务状态异常 等类型,输出字段为 code

// 数据请求成功
0: 成功

// 身份认证授权相关,系统预留异常状态,网站/管理平台或手机 APP 需执行后续操作
901: access token 过期或无效,需刷新令牌
902: refresh token 过期或失效,需重新进行登录认证操作
903: sign 签名无效,需重新登录手机 APP
904: client id 或 client secret 无效,需强制更新手机 APP
905: uuid 无效

# 业务错误状态

对于业务错误状态,通常会是四位数字状态码,但在业务场景需要的情况下,会有五位甚至六位的数字状态码,实际情况取决于业务场景的需求及复杂程度

对于业务错误的场景,网站/管理平台或手机 APP 通常情况下仅对错误内容进行通知提示,没有后续操作

# 跨域与重复请求

除少数历史遗留项目外,公司现有项目均使用前后端分离模式,即前端、服务端各自独立开发、运行和部署

# 跨域(CORS)

示例网址: https://abc.com:8080/

构成网址的三个基本元素

  • 协议(https://
  • 网址(abc.com
  • 端口(8080

两个网址之间,只要有上述三个元素中其中一项不一致,即为跨域访问。前后端项目在各自独立运行部署后,则天然处于跨域模式下

更多跨域资料:跨域资源共享 CORS 详解 (opens new window)

# 跨域请求模式

浏览器将 CORS 请求分成两类:

  • 简单请求(simple request)
  • 非简单请求(not-so-simple request)

# 简单请求

只要同时满足以下两大条件,就属于简单请求

  1. 请求方法是以下三种方法之一:HEADGETPOST
  2. HTTP的头信息不超出以下几种字段
    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值 application/x-www-form-urlencodedmultipart/form-datatext/plain

# 非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 PUTDELETE,或者 Content-Type 字段的类型是 application/json

# 跨域应用

根据以上描述的内容,结合公司使用的规则

  • 跨域
  • HTTP 动词为 POST
  • Content-Type 为 application/json

那么在发起 HTTP 数据请求时,HTTP Client 插件将会增加一次 HTTP 查询请求,称为 “预检” 请求(preflight),特点就是该请求的 General 段中的 Request Method 值为 OPTIONS,没有请求参数,该请求的功能仅在向服务器询问当前的 非简单请求 是否允许访问

应用服务器 / 静态网页服务器处理

项目开发之初,服务端应优先开发调试跨域支持,以免影响后续工作

另外,无论是具体的应用服务,如 NodejsPHPGOJava 等语言的应用服务,还是静态网页服务器 nginx,在检测到请求方法是 OPTIONS 时,请直接返回 204 状态,该状态意为请求成功,但无返回内容(NO CONTENT),该处理可避免预检请求执行业务内容,消耗不必要的服务器资源

# 部分特定应用场景

在数据格式的应用中,部分功能组件需对数据格式作出明确定义及要求,以便于组件能准确获取业务返回数据中的相关数据

# 数据表格

数据表格的标准数据交换格式

// 请求参数
{
  // 表格自动根据当前分页情况发送
  "pageNumber": number,
  "pageSize": number,
  // 自定义业务/查询参数
  ...
}

// 响应数据
{
  "code": 0,
  "data": {
    "grid": {
      // 总记录数
      "total": 53,
      // 数据列表内容
      "list": [
        {
          object // 数据模型
        },
        { ... }
      ]
    }
  }
}

以下为原表格输出数据格式,此处仅作为 归档记录 以便查询

原表格输出数据格式
// 请求参数
{
  // 表格自动根据当前分页情况发送
  "pageNumber": number,
  "pageSize": number,
  // 自定义业务/查询参数
  ...
}

// 响应数据
{
  "code": 0,
  "data": {
    "gridResult": {
      // 总记录数
      "totalRow": 53,
      // 数据列表内容
      "lists": [
        {
          object // 数据模型
        },
        { ... }
      ]
    }
  }
}

# 登录授权

访问类似用户登录、切换用户/公司/企业、交换/刷新 token 等接口时,在请求成功后,应输出 access 标准节点,用于输出登录授权相关的访问令牌及有效期限等内容

{
  "code": 0,
  "data": {
    "access": {
      "accessToken": string,
      "refreshToken": string,
      "expiresIn": number
    }
  }
}
最后更新时间: 8/11/2021, 8:42:41 AM