假设我有一个 REST API 端点:users/123/orders/234
.
正如 URI 所暗示的,我正在为用户 123 返回订单 234。我的问题是,哪个控制器应该处理请求?
它应该是用户控制器中的一个动作,比如GetOrder(int userId, int orderId)吗?还是应该在 OrdersController 中使用 GetOrder (int id)之类的东西来处理?
这只是品味问题,还是一种方式比另一种更“正确”?
假设我有一个 REST API 端点:users/123/orders/234
.
正如 URI 所暗示的,我正在为用户 123 返回订单 234。我的问题是,哪个控制器应该处理请求?
它应该是用户控制器中的一个动作,比如GetOrder(int userId, int orderId)吗?还是应该在 OrdersController 中使用 GetOrder (int id)之类的东西来处理?
这只是品味问题,还是一种方式比另一种更“正确”?
好吧,我主张您应该通过正在获取的实体。
在您的情况下,正在获取什么?:订单-> 所以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 说您不需要用户上下文,那么您不应该使用此方法。我不确定您的设计或要求。
我的 2 美分。您可以执行以下操作:
api/users/123/orders
- 转到 UsersController 并仅检索此特定用户 123 的所有订单api/orders
,其中转到 OrdersController 将给出系统中的所有订单。
api/users/123/orders/234
- 甚至不支持这个 uri 空间......因为用户试图访问有关订单 234 的详细信息,他们应该使用api/orders/234
应该带到 Orders 控制器的详细信息。
我的观点是为这些嵌套资源使用单独的控制器并使用默认操作名称。例如:
api/users/123/orders
- 在UserOrdersController@index
这样,只需查看控制器名称,您就知道路由在哪个实体上运行(User
在这种情况下)以及正在获取哪个实体(Order
在这种情况下)
此方法的一个缺点/不便之处在于您不能使用与ModelController
拥有一个抽象控制器相同的抽象控制器。因为index
在正常情况下ModelController
没有参数,而index
在这种联合控制器中需要id
它操作的实体模型。