将变体类型作为 REST 中的对象属性是不是合适?
Posted
技术标签:
【中文标题】将变体类型作为 REST 中的对象属性是不是合适?【英文标题】:Is it appropriate to have variant types as object properties in REST?将变体类型作为 REST 中的对象属性是否合适? 【发布时间】:2017-09-27 17:04:26 【问题描述】:在我的场景中,我发现自己创建了一个 REST 资源,表示要由工作流引擎运行的任务。我创建了以下资源:
[POST|GET] /api/tasks
任务的形式如下:
"Id": 123456789,
"Web": "https://foo/webfe/tasks/123456789",
"Description":
"Scenario": "TaskA",
"Parameters":
"GlobalParameter": "SomeCommonThing",
"TaskASpecificParameter1": "SomeThingOnlyMeaningfulForTaskA",
"TaskASpecificParameter2": "SomeOtherThingOnlyMeaningfulForTaskA"
值得注意的是,我有 ?.Description.Parameters[]
此参数字段本质上是一个键值字典,但在逻辑上以与 ?.Description.Scenario 的值直接相关的方式进行了架构化。
这在 REST 中是有意义的还是一个坏主意。作为链接资源,这是否更有意义?子资源呢?
额外问题:
如何在 C#/ASP.NET 中使用 Swagger/Swashbuckle 以一种可供客户端发现的方式执行此操作?
【问题讨论】:
【参考方案1】:它可能有助于将其可视化,就像您为数据库模式创建它一样。在您的任务表中,您不会将参数列表作为可能无限数量的列。您将有两张表,一张用于任务,一张用于参数,并且您将有一个从参数到任务的外键(多对一)。同样,您将拥有一个 API 端点 api/Parameters
,它接受 TaskId 并为您提供相关参数。
之后,您可以通过/api/Tasks/TaskId/Parameters
或/api/Parameters?TaskId=TaskId
在API 中轻松实现它,其中/api/Parameters/ParameterId
返回单个参数。
【讨论】:
这似乎也不寻常。架构会说参数模型是什么样的?那帖子呢?你会发布到参数,然后发布到带有链接的任务吗? 这并不罕见;事实上,我认为将数据源与其键分开比默认包含所有数据更为常见。就像我在加载 ***/Questions 时一样,我不想获得问题列表和他们所有的回答和 cmets——只是问题标题和简介。 Here's how Hangfire.io handles a similar situation。有一个作业队列表、一个作业表和一个作业参数表。每个队列有多个作业,每个作业有多个参数。 当然。但这是一个传统的关系数据库,它与 REST api 不同。 API 是与用户意图相关的状态综合,而数据库是实现细节。 对,这就是为什么我将 SOverflow 作为示例。 Slack 也会给你一个频道列表,你可以通过传递 ChannelId 找到它的消息。重点是分离集合子属性并通过键添加引用并不是非典型的。如果您想争论数据的呈现是否与用户的兴趣相关 - 好吧,当然,我绝不会建议针对其用例进行设计,但我们并没有真正得到一个。以上是关于将变体类型作为 REST 中的对象属性是不是合适?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django rest 框架中仅使用特定变体对象将项目添加到愿望清单?
REST API 包装器设计:将动态 json 作为 JSON.NET JObject / JArray 返回