В настоящее время я разрабатываю API REST с веб-API ASP.NET.
Я хочу предоставить такие методы (методы http не имеют значения - должны работать для всех):
- /API/клиент
- /api/client/CID1234 (CID1234 = идентификатор)
- /api/client/CID1234/заказы (заказы = действие)
Проблема в том, что Id должен быть необязательным - /api/client может возвращать список клиентов Action также должен быть необязательным - в одном случае я хочу получить конкретного клиента и в другом случае я хочу выполнить определенное действие на этом клиенте. (стиль RPC)
Я не думаю, что могу использовать ограничения, потому что «идентификаторы», которые я использую, выглядят совсем по-другому.
Этот подход не сработал:
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, потому что не может отличить «действие» от «идентификатора». «На контроллере «Клиент» не найдено действие, соответствующее имени «CID1234».
Чтобы получить необходимую мне гибкость, должен ли я использовать собственный селектор действий? Или это как-то возможно с помощью встроенных функций веб-API? Я понимаю, что кто-то может захотеть использовать заказы как отдельную сущность. Но с тем же успехом я мог бы иметь там настоящие «действия» (а не «сущности»). Например, «потерянный пароль», «изменить пароль» и так далее.
Спасибо за совет
PS: что-то вроде описанного здесь не совсем то, что я д быть готовым сделать. Плохой дизайн API.