# 通讯报文结构设计

## 前言

无论是内部子系统对接还是外部接口对接,都会涉及通讯报文,为了统一、标准化报文结构,必须规约报文结构。

我们的系统架构,通讯方式主要有 REST 和 GRPC 两种,REST 是 JSON 格式,GRPC 是 ProtoBuff 格式。

## 目的

- 服务端统一报文结构接口,客户端更加标准、简洁,程序更加工程化


## 规约


### JSON 

#### 规范

|   字段    | 必选 |   类型    |      说明     |
| :-------: | :--: | :-------: | :---------: |
|  `code`   |  是  | `integer` |   业务编码,0 表示成功,非 0 表示失败,具体说明看项目文档   |
| `info` |  是  | `string`  |   结果信息   |
|  `data`   |  是  | `object`  |   结果数据   |

对于列表格式的数据,其 data 结构体如下:

|   字段    | 必选 |   类型    |      说明     |
| :-------: | :--: | :-------: | :---------: |
|  `count`   |  是  | `integer` |   总条数   |
| `totalPages` |  是  | `integer`  |   总页数   |
|  `list`   |  是  | `array`  |   列表数据   |


注意事项:

由于历史原因,可能有些接口的 `data`, `list` 会返回 null 给前端,这是一种不好的设计,在后续的编码中必须禁止。对于没有数据的情况,返回空值(如 0, 空字符,空数组)而不是返回空(null, undefined 等)给前端。

#### 示例
  
```json
{
  "code" : 0,
  "message" : "成功",
  "data" : {
    "count": 88,
    "totalPages": 8,
    "list":[
      {
        "name": "foo",
        "id": 1
      }
    ]
  }
}
```

### ProtoBuff 

#### 规范

- 请求类必须用 Request 后缀

- 响应类必须用 Response 后缀

- 服务命名必须用 Service 后缀

- 响应类遵循以下的统一结构规范:


|   字段    | 必选 |   类型    |      说明     |
| :-------: | :--: | :-------: | :---------: |
|  `code`   |  是  | `int32` |   业务编码,0 表示成功,非 0 表示失败,具体说明看项目文档   |
| `info` |  是  | `string`  |   结果信息   |

注意事项:

由于历史原因,之前的项目没有规范约束,导致 info 和 msg 混用,今后**统一使用 info**。

为了兼容性和稳定性,已有的历史字段不做修改,新增的字段必须符合规范。

#### 示例

```protobuf
message CensorImageRequest {
    bytes image = 1;
    int32 terminal = 2;
    string ext = 3;// 文件扩展名
}

message CensorImageResponse {
    int32 code = 1;
    string info = 2;
}

service CensorService {
    rpc censorImage (CensorImageRequest) returns (CensorImageResponse);
}
```