現在、ASP.NET Web API を使用して REST API を設計しています。
私は次のようなメソッドを提供したいと考えています (http メソッドは無関係です - すべてで動作するはずです):
- /api/クライアント
- /api/client/CID1234 (CID1234 = ID)
- /api/client/CID1234/orders (注文 = アクション)
問題は次のとおりです: Idはオプションである必要があります - /api/client はクライアントのリストを返す可能性があります アクションもオプションである必要があります - ある場合は特定のクライアントを取得し、別の場合はそのクライアントで特定のアクションを実行したい. (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 }
);
たとえば、これは「アクション」と「id」を区別できないため、404 を返します。「名前「CID1234」に一致するアクションがコントローラー「クライアント」に見つかりませんでした。
必要な柔軟性を得るには、カスタム Actionselector を使用する必要がありますか? それとも、機能に組み込まれている Web API を使用して何とか可能ですか? 誰かが注文を別のエンティティとして使用したい場合があることを理解しています。しかし、そこには実際の「アクション」(「エンティティ」ではない) があるかもしれません。「ロストパスワード」、「パスワード変更」など。
アドバイスありがとうございます
PS:ここで説明されているようなことは、私がやりたいことではありません。不適切な API 設計。