5

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

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

它应该是用户控制器中的一个动作,比如GetOrder(int userId, int orderId)吗?还是应该在 OrdersController 中使用 GetOrder (int id)之类的东西来处理?

这只是品味问题,还是一种方式比另一种更“正确”?

4

3 回答 3

10

好吧,我主张您应该通过正在获取的实体。

在您的情况下,正在获取什么?:订单-> 所以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"
    });

这需要这样的操作方法:

public ActionResult FetchByUser(int user_id, int order_id)
{
}

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

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

操作方法是:

public ActionResult Fetch(int user_id, string type, int order_id)
{
}

注意:我会将此解释users/123/orders/234为 -> 用户123获得订单234。如果像@karan 说您不需要用户上下文,那么您不应该使用此方法。我不确定您的设计或要求。

于 2013-05-15T05:25:32.493 回答
3

我的 2 美分。您可以执行以下操作:

api/users/123/orders- 转到 UsersController 并仅检索此特定用户 123 的所有订单api/orders,其中转到 OrdersController 将给出系统中的所有订单。

api/users/123/orders/234- 甚至不支持这个 uri 空间......因为用户试图访问有关订单 234 的详细信息,他们应该使用api/orders/234应该带到 Orders 控制器的详细信息。

于 2013-05-15T15:32:50.150 回答
0

我的观点是为这些嵌套资源使用单独的控制器并使用默认操作名称。例如: api/users/123/orders- 在UserOrdersController@index

这样,只需查看控制器名称,您就知道路由在哪个实体上运行(User在这种情况下)以及正在获取哪个实体(Order在这种情况下)

此方法的一个缺点/不便之处在于您不能使用与ModelController拥有一个抽象控制器相同的抽象控制器。因为index在正常情况下ModelController没有参数,而index在这种联合控制器中需要id它操作的实体模型。

于 2019-03-23T18:40:14.637 回答