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 响应更适合您的场景,因为服务器收到、理解并接受了请求。
考虑以下 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 响应更适合您的场景,因为服务器收到、理解并接受了请求。