首页 > 解决方案 > c#.net core 2 web api:缺少父对象和/或验证的正确HTTP结果?

问题描述

考虑以下网址

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

在订单控制器中:

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

问题1:这个方法到底应该存在于CustomerController还是OrderController中?对我来说,订单控制器更有意义,因为我在这里返回订单,但路由是客户的,......

问题 2:在我的核心和数据层中,Order 对象有一个链接到它的客户。我的 api 层中的绑定模型有一个整数 CustomerId 我在哪里验证给定的客户 ID 实际上来自现有客户?是否可以通过致电客户服务在控制器中验证这一点?如果是这样,我可以只返回 NotFound() 吗?还是我应该做其他事情,以便用户清楚的是找不到客户?

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

标签: c#asp.net-mvc-routingasp.net-core-webapi

解决方案


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

客户控制器

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

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

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

是否可以退货NotFound()

的。

If customerId does not match any existing customer, NotFound would be the appropriate response according to the HttpStatusCode 404 Description.


推荐阅读