将变体类型作为 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 返回

变体但不是对象

使用 Delphi 管理变体中的空值

如何将 Postgres Hstore 数据类型转换为雪花对象或变体

变体记录而不是重载的对象类型?