有条件地为同一端点返回不同的 REST API 响应对象

问题描述 投票:0回答:2

以下场景不遵循 RESTful 标准,并且很想知道如何最好地构建我的 API 来实现相同的目标。

对于针对资源的给定 GET 请求,例如

GET /api/person/1
,如果原则包含一个声明,我想返回额外的属性。

例如

GET /api/person/1 (Without IsAdmin claim)
{
  name: "Buck Rogers",
  dateOfBirth: 2000-01-01T00:00:00.000
}
GET /api/person/1 (With IsAdmin claim)
{
  name: "Buck Rogers",
  dateOfBirth: 2000-01-01T00:00:00.000,
  adminNote: "Something private"
}

因此,我有条件地为同一资源请求返回两个不同的 DTO,这是不允许的。

如何以 RESTful 方式实现这一目标?

更新:

有人建议我可以定义

adminNote
属性并根据条件将其设置为 NULL。如果可能有多个条件来确定包含哪些属性,我将如何处理这种情况?例如

GET /api/person/1 (With IsModerator claim)
{
  name: "Buck Rogers",
  dateOfBirth: 2000-01-01T00:00:00.000,
  moderatorNote: "Something else private"
}

我希望避免添加仅在一种特定情况下不为空的额外属性。

rest asp.net-core-webapi api-design
2个回答
0
投票

您可以使用所有三个字段创建一个 Person 资源,当 IsAdmin 为 false 或没有声明时,您可以将 adminNotes 设置为 null。并且为了不返回该属性,您可以使用

@JsonInclude(Include.NON_NULL)
(对于 java,类似这样的东西可能也可在 asp.net 中使用)。因此您无需创建两个单独的实体或 DTO。


0
投票

根据您的更新,我认为您的想法是正确的。

定义一个具有一组仅在特定情况下填充的字段的模式是完全可以的。一个示例是“with admin”声明,但另一个示例是用户提供的字段掩码或视图的想法(有关示例,请参阅AIP-161)。

如果您担心这些字段堆积太多,您可以随时将字段分组为包含所有管理字段的

adminInfo
,但这可能没有必要...

© www.soinside.com 2019 - 2024. All rights reserved.