Javascript 对POST数据使用数组键或数组值的RESTful api

Javascript 对POST数据使用数组键或数组值的RESTful api,javascript,json,laravel,rest,api-design,Javascript,Json,Laravel,Rest,Api Design,我正在构建一个RESTful api,需要从前端获取复杂数据。但是我不确定我应该选择哪一个作为POST数据 我应该得到路线组所有可能路线的价格。例如:有一条总线,从端口1开始,到端口2,在端口3结束。我应该得到每种乘客类型的路线价格表: port-1 to port-2 port-1 to port-3 port-2 to port-3 我在考虑这两种选择。通过查看下面的示例数据,您将了解数据类型 一,- 二,- 我不确定哪一个更适合前端 在第一个例子中,这看起来很清楚,但是有太多重复数据,开

我正在构建一个RESTful api,需要从前端获取复杂数据。但是我不确定我应该选择哪一个作为POST数据

我应该得到路线组所有可能路线的价格。例如:有一条总线,从端口1开始,到端口2,在端口3结束。我应该得到每种乘客类型的路线价格表:

port-1 to port-2
port-1 to port-3
port-2 to port-3
我在考虑这两种选择。通过查看下面的示例数据,您将了解数据类型

一,-

二,-

我不确定哪一个更适合前端

在第一个例子中,这看起来很清楚,但是有太多重复数据,开发人员应该操纵数据。也许可以将
data-
属性设置为input,并在提交之前在js端处理数据

在第二种情况下,没有重复的数据,所有数据都按键分组,并且可用于输入的
name
属性。例如:
name=“价格[1-2][1][乘客][1][价格]”


你觉得怎么样?还是你有更好的主意?

我认为第一种情况最好。
你可以看看。

这里没有正确和错误的答案,但它主要归结为权衡:

是否有必要让这些端点速度快、流量小、易于使用?(甚至可以将此端点拆分为专用的
price/departurePortId/arrivalPortId
端点。)

根据您的使用情况,冗余平面方法也可能优于嵌套对象,尤其是当客户机需要
groupBy
一个不同的属性时,因为在平面阵列上实现这个属性非常简单。(展平嵌套对象可能会成为一场噩梦。我曾经去过那里。)

嵌套方法的一大缺点是它隐藏了元信息,所有这些ID:

  • {出发港}-{到达港}
  • {ticket\u type\u id}
  • {priceable_type}
  • {priceable_type_id}
它们仅用作(组合)键的动态值,如果它们是数字,则很难对其含义进行推理。如果你看到这样的反应,你就要处理魔法数字,并且必须知道它们的意图。因此,如果使用嵌套方法,我仍然会将所有数据保留在最终对象中

动态键的另一个缺点是,它们很难在提供api文档的许多库中表达。(例如,swagger在表达动态关键点的概念时遇到问题,如果您想添加动态关键点,则可能需要重新定义模型。)


话虽如此,我还是选择平淡的回答。这可能取决于您的用例

不过,我选择了一个改变,那就是将相关信息分组:

prices: [
    {
        ports: {
            arrival: {id: $value},
            departure: {id: $value},
        }
        ticket: {
            id: $value,
            type: $value,
        }
        priceable: {
            id: $value,
            type: $value
        },
        price: {
             amount: $value
        },
        companion_price: {
             amount: $value
        },
    }
]

只有原语值的缺点是很难更改/添加新字段。在整个平面对象上,解析信息会变得很麻烦。(假设您还想添加港口名称或价格的货币。假设您有不同的货币用于不同的定价信息。一个完整的简单响应可能会变成一个命名地狱,即:
出发港名称
到达港名称
伴随价格
).

你控制前端了吗?@k0pernikus是的,但我也应该考虑我的api服务来与其他人共享。你想用类似招摇过市的东西来记录你的api服务吗?@k0pernikus是的,可能是邮递员或其他服务。我还没有搜索过这个问题。我在回答中提到,在某些文档库中表达动态键不受支持。请阅读以了解我为什么否决这个“答案”。这里有一个正确的答案。不要只发布参考文献的链接,还要引用其中最有意义的部分,这样这个答案就可以独立存在了。谢谢你的回答。我也这么想。扁平化数据在后端有缺点。我想进行复杂的验证,以确保所有必要的数据都能提供给我。例如所有类型的票。我可以这样定义:你应该给我价格。78-90.1数据。这是不可读的,但很容易定义。对于嵌套方法,首先我应该对数据进行分组,然后进行验证。不确定哪一个是清楚的,但我想我会采用展平方法。@akcoban我已经添加了一个建议,在对象中包含对象,而不仅仅是原始值。
prices: [
    {departure_port_id}-{arrival_port_id}: [
        {ticket_type_id}: [
            {priceable_type}: [
                {priceable_type_id}: {
                    price: {value},
                    companion_price: {value},
                }
            ]
        ]
    ]
]
prices: [
    {
        ports: {
            arrival: {id: $value},
            departure: {id: $value},
        }
        ticket: {
            id: $value,
            type: $value,
        }
        priceable: {
            id: $value,
            type: $value
        },
        price: {
             amount: $value
        },
        companion_price: {
             amount: $value
        },
    }
]