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

Posted

技术标签:

【中文标题】使用 POST 数据的数组键或数组值的 RESTful api【英文标题】:RESTful api using array keys or array values for POST data 【发布时间】:2019-12-31 08:02:38 【问题描述】:

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

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

port-1 to port-2
port-1 to port-3
port-2 to port-3

我在考虑这两个选项。通过查看下面的示例数据,您将了解数据类型。

1-

prices: [
    
        departure_port_id: value,
        arrival_port_id: value,
        ticket_type_id: value,
        priceable_type: value,
        priceable_type_id: value,
        price: value,
        companion_price: value,
    ,
    
        ...
    
]

2-

prices: [
    departure_port_id-arrival_port_id: [
        ticket_type_id: [
            priceable_type: [
                priceable_type_id: 
                    price: value,
                    companion_price: value,
                
            ]
        ]
    ]
]

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

在第一个上,这看起来很清楚,但是有太多重复的数据,开发人员应该操作数据。或许可以设置data-属性为input,提交前应该在js端操作数据。

在第二个中,没有重复数据,全部按键分组,可用于输入的name 属性。喜欢:name="prices[1-2][1][passenger][1][price]"

你怎么看?还是你有更好的主意?

【问题讨论】:

你在控制前端吗? @k0pernikus 是的,但我也应该考虑将我的 api 服务分享给其他人。 你想用 swagger 之类的东西来记录你的 api 服务吗? @k0pernikus 是的,可能是邮递员或其他服务。我还没有搜索过。 我在回答中添加了一个提示,即在某些文档库中表达动态键不支持。 【参考方案1】:

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

是否需要让这些端点快速、流量少、“易于”使用? (也许将这个端点拆分成一个专用的price/departurePortId/arrivalPortId 端点甚至是有意义的。)

根据您的用例,冗余平面方法也可能比嵌套对象更好,尤其是。如果客户需要 groupBy 一个不同的属性,因为这在平面阵列上实现非常简单。 (扁平化嵌套对象可能会成为一场噩梦。我去过那里。)

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

departure_port_id-arrival_port_id ticket_type_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
        ,
    
]

只有原始值的缺点是很难更改/添加新字段。在整个平面对象上,信息解析起来会变得很麻烦。 (假设您还想添加港口名称或价格货币。假设您对不同的定价信息有不同的货币。一个完整的平面响应可能会变成一个命名地狱,即:departure_port_namearrival_port_name、@ 987654326@).

【讨论】:

感谢您的回答。我也有同样的想法。扁平化数据在后端有缺点。我想进行复杂的验证,以确保所有必要的数据都来找我。比如所有票种。我可以这样定义:你应该给我价格。78-90.1 数据。这不可读但易于定义。对于嵌套方法,首先我应该对数据进行分组并在验证它之后。不确定哪个很清楚,但我想我会采用扁平化方法。 @akcoban 我添加了一个建议,即在您的对象中包含对象,而不仅仅是原始值。【参考方案2】:

我认为第一种情况是最好的。 你可以看看https://redux.js.org/recipes/structuring-reducers/normalizing-state-shape。

【讨论】:

请阅读this 了解我为什么不赞成这个“答案”。 这里有一个正确的答案。不要只发布参考链接,还要引用其中最有意义的部分,以便此答案可以独立存在。

以上是关于使用 POST 数据的数组键或数组值的 RESTful api的主要内容,如果未能解决你的问题,请参考以下文章

PHP POST请求 字符串和数组传值的区别

php,数组

确定 PHP 数组是不是使用键或索引 [重复]

PHP数组函数总结

PHP数组函数总结

定义默认数组值的最简洁方式