我目前正在使用ASP.NET Web API设计一个REST api。
我希望提供以下方法(http方法无关 - 应适用于所有):
- /api/client
- /api/client/CID1234(CID1234 = Id)
- /api/client/CID1234/orders(orders = action)
问题是: Id应该是可选的 - /api/client可能返回客户列表 Action也应该是可选的 - 在一种情况下,我想获取特定的客户,在另一种情况下,我想对该客户执行某个操作(RPC风格)
我认为我不能使用约束,因为我使用的“IDs”看起来非常不同。
这种方法行不通:
config.Routes.MapHttpRoute(
name: "RpcStyleApi",
routeTemplate: "rest/{controller}/{action}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
);
这种方法也没有起作用:
config.Routes.MapHttpRoute(
name: "RpcStyleApi",
routeTemplate: "rest/{controller}/{action}"
);
config.Routes.MapHttpRoute(
name: "RpcStyleApi2",
routeTemplate: "rest/{controller}/{id}/{action}",
defaults: new { action = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "rest/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
例如,由于不能区分“action”和“id”,因此此代码返回404: “在名称为‘CID1234’的控制器上找不到与之匹配的‘动作’。” 我应该选择自定义Actionselector来获得所需的灵活性吗?还是可以使用Web API内置功能来实现?我知道有些人可能希望将订单作为单独的实体。但我也可以在那里使用真正的“actions”(而不是“entities”),例如“lostpassword”、“changepassword”等等。 谢谢您的建议。 附言:像这里描述的东西并不是我愿意做的事情。糟糕的API设计。