我目前正在使用 ASP.NET Web API 设计一个 REST api。
我想提供这样的方法(http方法无关紧要 - 应该适用于所有人):
- /api/客户端
- /api/client/CID1234(CID1234 = ID)
- /api/client/CID1234/orders(订单=操作)
问题是: Id应该是可选的 - /api/client 可能会返回客户端列表 Action也应该是可选的 - 在一种情况下,我想获取特定的客户端,而在另一种情况下,我想对该客户端执行特定操作. (RPC 风格)
我认为我不能使用约束,因为我使用的“ID”看起来非常不同。
这种方法不起作用:
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 }
);
例如,这会返回 404,因为它无法区分“action”和“id”。“在与名称“CID1234”匹配的控制器“客户端”上未找到任何操作。
为了获得我需要的灵活性,我应该使用自定义 Actionselector 吗?或者是否有可能使用内置功能的 Web API?我了解有人可能希望将订单用作单独的实体。但我还不如在那里有真正的“行动”(而不是“实体”)。像“丢失密码”,“更改密码”等等。
感谢您的意见
PS:这里描述的事情并不是我愿意做的事情。糟糕的 api 设计。