Rails [请教] API 返回对象数据结构是否需要固定?

RunnerLee · 2017年07月31日 · 最后由 RunnerLee 回复于 2017年10月10日 · 1835 次阅读

前景概述

APP 根据虚拟物品计费点创建订单。创建订单时需要提交不同的表单。 例如 A 付费点需要提交姓名及生日,B 续费点需要提交姓名及邮箱。

实现

创建订单表 orders, 计费点表 products

表单表 forms,

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| app_id     | int(10) unsigned | NO   | MUL | NULL    |                |
| product_id | int(10) unsigned | NO   |     | NULL    |                |
| version_id | int(10) unsigned | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

表单字段配置表 form_fields,

+------------+--------------------------------------------+------+-----+---------+----------------+
| Field      | Type                                       | Null | Key | Default | Extra          |
+------------+--------------------------------------------+------+-----+---------+----------------+
| id         | int(10) unsigned                           | NO   | PRI | NULL    | auto_increment |
| form_id    | int(10) unsigned                           | NO   | MUL | NULL    |                |
| name       | varchar(30)                                | NO   |     | NULL    |                |
+------------+--------------------------------------------+------+-----+---------+----------------+

订单表单表 form_values

+------------+--------------------------------------------+------+-----+---------+----------------+
| Field      | Type                                       | Null | Key | Default | Extra          |
+------------+--------------------------------------------+------+-----+---------+----------------+
| id         | int(10) unsigned                           | NO   | PRI | NULL    | auto_increment |
| order_id   | varchar(22)                                | NO   |     | NULL    |                |
| name       | varchar(30)                                | NO   |     | NULL    |                |
| value      | varchar(255)                               | NO   |     | NULL    |                |
+------------+--------------------------------------------+------+-----+---------+----------------+

创建订单时,传入计费点 ID,并将表单内容通过 json 提交

POST /orders
product_id=1&attributes=%7B%22username%22%3A%22testing%22%7D

通过付费点获取到表单及表单字段配置进行表单校验后入库。

问题

当返回订单信息时,表单的值应该怎么下发? 目前我使用的是

{
    "id":1,
    "attributes":[
        {
            "name":"username",
            "value":"testing"
        },
        {
            "name":"birthday",
            "value":"2017-07-10"
        }
    ]
}

这样当不同计费点的表单不同时,attributes 内的结构时固定的。

但也有朋友说应该直接这样

{
    "id":1,
    "attributes":{
        "username":"testing",
        "birthday":"2017-07-10"
    }
}

或者是将上面这种 attributes 的形式直接转为 json 字符串。

各位能否指点一下?

个人觉得第二种更加通用

realwol 回复

抱歉,一直忘记回来回复下了。

我还是倾向于返回的数据格式固定,我认为当 API 无法确定返回的结构是一件比较揪心的事,需要在代码加很多判断。感谢哈!

RunnerLee 关闭了讨论。 10月10日 19:19
需要 登录 后方可回复, 如果你还没有账号请 注册新账号