REST API嵌套资源应该由哪个控制器处理?

Die*_*ros 3 rest asp.net-mvc asp.net-web-api

假设我有一个REST API端点:users/123/orders/234.

正如URI所暗示的那样,我正在为用户123返回234.我的问题是,哪个控制器应该处理请求?

它应该是UsersController中的一个动作,比如GetOrder(int userId,int orderId)?或者它应该在OrdersController中使用类似GetOrder (int id)的东西来处理?

这只是一种品味问题,还是比其他方式更"正确"?

gid*_*eon 7

好吧,我主张你应该去被提取的实体.

在你的情况下提取什么?:订单 - >所以OrdersController.

如果在给定特定订单ID的情况下提取用户,那么它将是一个UsersController.

您应该查看stackexchange api以获得很好的示例:http://api.stackexchange.com/docs

有很多动作,但它们每个都按照它们所操作的实体进行分组,我打赌它们是他们所在的控制器.


此路线没有内置设置.您可以执行以下操作:

这是一条特定的路线.

routes.MapHttpRoute(
    name: "users_orders",
    routeTemplate: "api/{controller}/{user_id}/Orders/{order_id}",
    defaults: new
    {
        controller = "Orders",
        action = "FetchByUser"
    });
Run Code Online (Sandbox Code Playgroud)

哪个需要这样的动作方法:

public ActionResult FetchByUser(int user_id, int order_id)
{
}
Run Code Online (Sandbox Code Playgroud)

你可以尝试做一个更通用的路线,如下所示:

routes.MapHttpRoute(
    name: "fetch_route",
    routeTemplate: "api/{controller}/{id1}/{type}/{id2}",
    defaults: new
    {
        action = "Fetch"
    });
Run Code Online (Sandbox Code Playgroud)

而行动方法将是:

public ActionResult Fetch(int user_id, string type, int order_id)
{
}
Run Code Online (Sandbox Code Playgroud)

注意:我会解释这个 - > users/123/orders/234用户123得到订单234.如果@karan说你不需要用户上下文那么你就不应该有这个方法.我不确定你的设计或要求.