RESFTful Web API是否应该在Update操作(Put)上返回修改后的实体?

时间:2017-09-07 12:50:07

标签: rest asp.net-web-api

我正在创建一个新的Web API,我对Update操作有疑问(这是一个基本的CRUD)。我应该使用更新的实体数据返回DTO吗?我希望我的API是RESTful。

4 个答案:

答案 0 :(得分:2)

在这里阅读

https://tools.ietf.org/html/rfc7231

它说,我引用:

  

对于PUT(第4.3.4节)或POST等状态更改请求   (第4.3.3节),它意味着服务器的响应包含   该资源的新表示,从而区分它   表示可能只报告行动的表示(例如,"它   工作"!)。这允许创作应用程序更新其中   本地副本,无需后续的GET请求。

但是,您不需要对此进行太多修复,例如,当您创建某些内容时返回201也是完全正常的,并且您可能希望添加所创建资源的唯一标识符。

对于更新,200也可以。 204既可以接受也可以接受。

底线是...只返回您需要的数据,如果您需要查看整个更新的对象然后返回它。如果你不这样做的话。请记住,某些对象可能非常大,并且在它们下面有一个完整的对象图,没有必要在网络上发送太多数据。

我想最重要的是选择一种做事方式,然后保持一致并随处使用同样的东西

答案 1 :(得分:1)

首先,返回DTO与RESTful一起 nothing

DTO是为了将数据传输到远程接口而创建的模式(并且Web服务非常适合此模式),这是正确的。

但是,使用DTO不会使您的应用程序或多或少具有REST。您的应用程序可以使用DTO来更好地控制REST API中公开的数据。就是这样。

如果您的更新操作依赖于PUT HTTP方法(用于替换具有新表示的资源的状态),您可以想要返回200204状态代码以指示操作已成功。

如果您选择200,则可以返回最近更新资源的新状态的表示。如果您选择204,则不得返回任何陈述。

表示我指的是JSON文档,XML文档或可用于表示给定资源状态的任何其他内容。

答案 2 :(得分:1)

我们通常在更新成功后返回 NoContentResult 。例如,

[HttpPut("{id}", Name = "UpdateUser")]
public IActionResult UpdateUser(Guid id, [FromBody] UserUpdateDto user)
{
    if (user == null)
    {
        return BadRequest();
    }

    if (!_repository.UserExists(id))
    {
        return NotFound();
    }

    var entity = _repository.GetUser(id);
    Mapper.Map(user, entity);

    _repository.UpdateUser(entity);

    return NoContent();
}

NoContent 基本上会返回状态代码 204 。以下是NoContentResult的源代码。

public class NoContentResult : StatusCodeResult
{
public NoContentResult()
    : base(204)
{
}
}

答案 3 :(得分:0)

从PUT操作返回数据是可选的,但不是必需的。如果您希望在模型中计算出对客户有用的任何内容,则返回它们,否则返回204.