是否应为RESTful端点输入DTO与输出DTO匹配?

时间:2015-08-04 03:33:48

标签: rest restful-architecture

我正在使用RESTful API,而且我在为API提供输入的过程中遇到了一些麻烦。

我们说我有一个" Person"可以像这样获取的资源:api/person/{id}并返回如下对象:

public class Person
{
    public int Id { get; set; }
    public string Surname { get; set; }
    public string GivenName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

如果我想更新该人,API应该是一个完整的Person实例,还是可以使用单独的DTO?

让我们说例如DateOfBirth无法更改,是否认为RESTful接受此输入:

public class UpdatePersonDto
{
    public string Surname { get; set; }
    public string GivenName { get; set; }
}

这意味着在使用api/person/{id}时,我会让此端点Person返回GET,而在使用UpdatePersonDto时接受输入PUT。这对我来说听起来不对,但我不确定我是不是只是偏执狂。

所以我想我的问题总结为:是否适合接受给定资源端点上的数据结构与端点返回的数据结构不同?

2 个答案:

答案 0 :(得分:1)

似乎REST的共识是,当使用PUT进行更新时,可以提供整个实体进行替换。

以编程方式,它可以让PUT / person / {id}接受输入,在幕后映射到UpdatePersonDTO而不是Person。

唯一的“问题”可能是它违背了普遍的期望。

中间解决方案可能是POST(或PUT)/ person / {id} / mutables,可以接受UpdatePersonDTO。

编辑:或者更明显的是:PUT / person / {id} / name采用包含两个字段的PersonName参数。

答案 1 :(得分:0)

当谈到REST严格规则时(即使存在这样的规则:/),您应该将整个实体发送到PUT。现在你可以:

  1. 无声地忽略无法更新的字段 - 在某些情况下建议但应记录在案。
  2. 如果检测到无法更新的字段被赋予新值,则抛出异常。
  3. 使用可以更新一组字段的PUT,而不是使用PATCH,而不需要整个实体,例如只能发送名字和姓氏。
  4. 就个人而言,我认为最好的选择是1或3.我不建议引入@morsor建议的新端点。这样的端点总是引入一团糟。通常,较少的端点用于更好(更清晰,更容易理解)API。