c# - 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() 吗?还是我应该做其他事情,以便用户清楚的是找不到客户?
同样,这是一个虚构的例子。
解决方案
问题 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.
推荐阅读
- typescript - 如何修复“但 'T' 可以用不同的约束子类型实例化。”
- php - 如何将数据库连接传递给类构造函数?
- python - 我正在尝试从 landsat-5 TM 获取某个特定月份的时间序列 LST。我遍历了图像集,但仅从一张图像中获得了 LST
- android - flutter build apk --release --no-sound-null-safety 命令给出错误
- r - 如何编写一个检查所有特殊值的循环并将这些值的数量放入每个gene_id
- python - 在 Tkinter 中,我如何做到这一点,以便在单击“显示密码按钮”时使用“隐藏密码”按钮进行切换
- spring-boot - 如何在 SpringBoot 中使用查询注释将实体与关系连接起来
- r - 使用 case when 跨列评估变量并分配存储桶
- flutter - 如何在颤动中显示多个阵列图像?
- python - 如何将 Jupyter notebook 安装到克隆的 anaconda 环境中