我正在创建一个新的Web API,我对Update操作有疑问(这是一个基本的CRUD)。我应该使用更新的实体数据返回DTO吗?我希望我的API是RESTful。
答案 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方法(用于替换具有新表示的资源的状态),您可以想要返回200
或204
状态代码以指示操作已成功。
如果您选择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.