c# .net core 2 web api:缺少父对象和/或验证的正确 HTTP 结果?

c# .net core 2 web api: correct HTTP result for missing parent object and / or validation?

考虑以下 URL

这是一个示例,我在这里使用客户和订单,以便于理解设置。

在订单控制器中:

[HttpGet("~/api/customer/{customerId:int}/orders", Name = nameof(GetOrdersByCustomerIdAsync))]
[ProducesResponseType(200)]
[ProducesResponseType(404)]
public async Task<ActionResult<IEnumerable<OrderListItemResourceModel>>> GetOrdersByCustomerIdAsync(int customerId:int){}

问题一:这个方法到底应该存在于CustomerController还是OrderController中? 对我来说,它在订单控制器中更有意义,因为我在此处执行 return 订单,但路由是客户的路由,...

问题 2:在我的核心和数据层中,Order 对象有一个链接到它的客户。我的 api 层中的绑定模型有一个整数 CustomerId 我在哪里验证给定的客户 ID 实际上来自现有客户? 在controller中打电话给客服验证一下可以吗? 如果是这样,我可以 return NotFound() 吗?或者我应该做点别的,让用户清楚是客户没找到?

同样,这是一个虚构的例子。

问题 1 - ~/api/customer/{customerId:int}/orders 在客户控制器或订单控制器中?

客户控制员

此处您作为客户的 属性 访问订单,因此该操作属于客户控制者。但是如果你正在访问,比如 ~api/orders 这将属于订单控制器,因为这是访问独立于任何其他资源的订单资源。

问题 2 - 在哪里根据现有数据库记录验证客户 ID

这在很大程度上取决于您的实施。 Asp.Net Core 提供了通过依赖注入从几乎任何地方(过滤器、服务等)执行此操作的功能。所以这取决于你的应用程序的结构。

能不能return NotFound() ?

.

如果 customerId 不匹配任何现有客户,NotFound 将是根据 the HttpStatusCode 404 Description 的适当响应。

关于 title/second 问题

对于 API,不能通过网络浏览器访问的内容,您应该 return 比 404 Not Found 更有用的内容。我强烈反对对成功但没有数据的 API 调用使用 404。

NoContent()(状态代码 204)更适合,因为路由或调用本身没有错误,只是没有内容可以返回。

根据 RFC 2616 HTTP 协议定义,400 个响应用于

Client Error - The request contains bad syntax or cannot be fulfilled

这里没有客户端错误,只是没有该 ID 的数据。而 200 条回复...

Success - The action was successfully received, understood, and accepted

这比 400 响应更适合您的场景,因为服务器收到、理解并接受了请求。