REST APIの概念
REST APIの設計について3つの質問があります。誰かに光を当ててもらいたいと思っています。私は何時間も執拗に検索しましたが、私の質問に対する答えがどこにも見つかりませんでした(たぶん、何を検索すればいいのか分かりませんか?)。 質問1 私の最初の質問は、アクション/ RPCに関するものです。しばらくREST APIを開発していて、コレクションやリソースの観点から物事を考えることに慣れています。しかし、私はパラダイムが適用されないように見えるいくつかのケースに遭遇し、これをRESTパラダイムと調整する方法があるかどうか疑問に思っています。 具体的には、リソースを変更するとメールが生成される場合があります。ただし、後で、ユーザーは以前に送信された電子メールを再送信することを具体的に示すことができます。電子メールを再送信しても、リソースは変更されません。状態は変更されません。発生する必要があるのは単にアクションです。アクションは特定のリソースタイプに関連付けられています。 ある種のアクション呼び出しをリソースURI(例:)と混合することは適切/collection/123?action=resendEmailですか?アクションを指定してそれにリソースIDを渡す方がよいでしょうか(例:)/collection/resendEmail?id=123?これはそれについて取り組むのに間違った方法ですか?従来(少なくともHTTPでは)実行されるアクションはリクエストメソッド(GET、POST、PUT、DELETE)ですが、これらは実際にはリソースを使用したカスタムアクションを許可していません。 質問2 URLのクエリ文字列部分を使用して、コレクションをクエリするときに返されるリソースのセットをフィルター処理します(例:)/collection?someField=someval。次に、APIコントローラー内で、そのフィールドと値とどのような比較を行うかを決定します。これは実際には機能しないことがわかりました。APIユーザーが実行する比較のタイプを指定できる方法が必要です。 私がこれまでに作ってみた最高のアイデアは、APIのユーザーはフィールド名(例えばへの付属物として、それを指定することができるようにすることです/collection?someField:gte=somevalどこでリソースを返す必要があることを示すために- someField何でも(> =)以上に等しいsomevalです。これは良いアイデアですか?悪いアイデアですか?そうであれば、なぜですか?指定されたフィールドと値で実行する比較のタイプをユーザーが指定できるようにするより良い方法はありますか? 質問3 s /person/123/dogsを取得するようなURIがよく見られます。最終的に私はそのようなURIを作成することで、実際には特定のIDでフィルターされたコレクションにアクセスしているだけだと考えているので、私は一般にそのようなものを避けました。これはと同等です。REST URIが2つ以上のレベル()になる正当な理由はありますか?persondogsdogsperson/dogs?person=123/collection/resource_id