代码之家  ›  专栏  ›  技术社区  ›  Hairydruidy

c 35;.net core 2 web api:是否更正缺少父对象和/或验证的HTTP结果?

  •  0
  • Hairydruidy  · 技术社区  · 7 年前

    考虑以下URL

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

    在顺序控制器中:

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

    问题1:该方法是否实际存在于客户控制器或Orror控制器中? 对我来说,这在订单控制中更合理,因为我在这里退货,但路线是客户的。。。

    问题2:在我的核心数据层中,order对象有一个客户链接到它。我的api层中的绑定模型有一个整数CustomerId 我在哪里验证给定的客户ID实际上是来自现有客户的? 可以通过呼叫客户服务在控制器中验证这一点吗? 如果是,我可以返回NotFound()吗或者我应该做些别的事情,这样用户就可以清楚地知道是客户找不到了?

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

    2 回复  |  直到 7 年前
        1
  •  0
  •   Gerald Chifanzwa    7 年前

    问题1 - ~/api/customer/{customerId:int}/orders 在客户控制员还是订单控制员?

    客户控制员

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

    问题2 -在哪里对现有的DB记录验证客户ID

    这取决于您的实现net核心提供了通过依赖注入从几乎任何地方(过滤器、服务等)实现这一点的功能。所以这取决于应用程序的结构。

    你能不能回来 NotFound() 是吗?

    是的 .

    如果CuuleID与任何现有客户不匹配, 未找到 根据 the HttpStatusCode 404 Description 是的。

        2
  •  0
  •   p3tch    7 年前

    关于标题/第二个问题

    对于API,不是通过web浏览器访问的东西,您应该返回比404 not Found更有用的东西我强烈反对将404用于成功但没有数据的API调用。

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

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

    客户端错误-请求包含错误语法或无法 满足

    这里没有客户端错误,只是没有该ID的数据。而200个响应…

    成功-操作已成功接收, 理解并接受

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

    推荐文章