.Net Core Rest API请求/响应最佳做法

时间:2018-10-05 17:04:39

标签: rest asp.net-core

我需要一些有关如何最好地构建Rest API的请求和响应的建议。

我主要是试图将自己限制为仅对一种资源进行CRUD操作,而我只能使用一个对象:例如,如果资源为“ book”,那么我将在控制器中执行以下操作

  • [HttpPost(“ books”)]图书创建(图书)
  • [HttpGet(“ books”)] Book Get(int id)

这是相对困难的事。

现在,对于创建资源的更复杂的示例,我需要接收与资源不同的复杂对象,并返回一个包含资源和额外数据的对象 例如,对于Order资源,我在控制器中执行以下操作:

[HttpPost(“ / order”)] CreateOrderResponse CreateOrder(CreateOrderRequest createOrderRequest)

在这里,我的操作将使用“ CreateOrderRequest”对象来创建订单。 然后,我想返回一个“ createOrderResponse”对象,它包含订单以及客户端需要的其他信息。

我不确定这是最好的方法吗,有什么建议吗?

预先感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我更喜欢以下内容:

[HttpPost("/order")] CreateOrderResponse CreateOrder(CreateOrderRequest createOrderRequest)

这就是原因:

  • 通过这种方法,您可以保护公共API免受实施细节的影响。如果将模型公开给API,则无法做出相同的保证。
  • 您还可以针对请求格式进行验证。在某些情况下,创建记录时可能需要模型的一个子集,而在编辑数据时可能需要另一个子集。这种方法也将允许您处理这种情况。
  • 安全性。您是否要将该书直接添加到DbContext并保存?还是将其附加并直接更新?从安全和数据质量的角度来看,这些都是潜在的问题。

但是有缺点:

  • 这种方法很耗时。如果您正在写一些东西作为学习练习或快速实现,那么可能不值得花费时间。而且增加了复杂性。但是,当您意识到在所有情况下Book对象都不足够时,您可能会发现复杂性。
  • 您会觉得在不同的地方有重复的代码。代码可能看起来是相同的,但是用例实际上是不同的,并且可能会随着时间而变化。此时,具有Book参数将是一个责任。