REST APIでの複雑なアクションの命名

RESTの説明にあるすべてのマニュアルでは、ユーザーなどの単純な例を示しています。/usersリソースになります。ここに1人のユーザーがいます。/users/[id]で、アクションを追加/削除/変更します。

しかし、アクションが複雑または複雑で、GET \ POST \ DELETEに適合しない場合はどうでしょうか?



それを理解しようとして、彼はトースターで質問をし、さらに発掘を続けました。
網羅的な記事を見つけましが、完全な翻訳を処理することはできませんので、短いメモで結論を要約します。

問題について簡単に説明します。

RESTとRPCの主な違いは、URLがリソースのアドレスであり、標準のHTTPメソッドを使用して実行されるアクションであるというアプローチです:GET \ POST \ DELETE \ PATCH \ ...要するに、リソースは動詞ではなく名詞です。

つまり / api / users / do_some_cool_staffまたはGET / users / 1?のようなものが表示された場合、action = delete、わかっています-これはRESTではありません!


RESTインターフェースを備えた核スーツケースアプリケーションを作成しているとします。 機能は次のとおりです。

1.ロケット[id]によるアクション:国での打ち上げ、国での販売、サービス、償却

リソース/ミサイル/ [id]を使用するのは論理的ですが、これらのアクションでは、PUTまたはPATCHを使用するだけでは不正確で情報量が多くなります。

間違ったオプション:
1.標準HTTPメソッドのリストを展開できます。 ただし、さまざまなクライアント、既製のライブラリ、およびフィルタリングサーバー設定のサポートには困難がある場合があります。
2. /ミサイル/ [id]?Action = launchは、RESTアプローチ全体を無意味にします。 ほとんどの機能はアクションにあります。
3. /ミサイル/ [id] / launch-動詞をリソースアドレスにドラッグするのは正しくありません。
4.リンク/ミサイル/ [id] /国/ [country_id] /-正確に何が起こっているのか明確ではありません-売却または核攻撃。

正しいオプション
リソースのプロパティに正しくアクセスします。 つまり アクション「/ users / [id] / disable」ではなく、リソース「/ users / [id] / disable d 」、標準メソッドGET \ POST \ ...

ロケット打ち上げ:POST /ミサイル/ [id] /国上陸/ [country_id]
ロケット販売:POST /国/ [country_id] /ミサイル購入/ [id]またはPOST /ミサイル/ [id] /所有者/ [country_id]
サービス:POST /ミサイル/ [id] /オンサービス
UPD:
ロケット打ち上げ:POST /ミサイル/ [id] /ランチャー{target:[country_id]}
ロケットセール:パッチ/ミサイル/ [id] {所有者:[country_id]}
サービス:PUT /ミサイル/ [id] /オンサービスまたは個別のミサイルサービスがある場合POST / missiles_service / {missile:[id]}
削除:DELETE /ミサイル/ [id]またはPUTを「削除」する他のオプションがある場合/ミサイル/ [id] /使用済み

2.国[country_id]で適切なロケットを発射します

ミサイルは非常に小型で、最初に検索を実行し、次にオーバーヘッドを起動すると仮定します。長時間実行するには、すぐに実行するために1つの要求が必要です。
間違ったオプション:
1.ミサイルのコレクション全体(「未知の特定のミサイルの[id]」)に対して「起動」を実行します。
2.選択した国からのアクション「ロケットをゲット」

正しいオプション
アクションが複雑で、リソースオブジェクトのアトミックアクションで表現できない場合、リソースプロセスが作成されます。 同様に、銀行取引など、複雑なビジネスロジック(複数の依存アクションで構成される)で複合アクションを実行する場合、リソースプロセスが作成されます。

より詳細な考え
ロイ・フィールディングの論文でリソースについて述べていることを見てみましょう。 ビジネス機能/プロセスは、リソースの定義にきちんと適合することができます。 つまり、複数のリソースにまたがる複雑なビジネスプロセスの場合、ビジネスプロセスをリソース自体と見なすことができます。 たとえば、銀行のドメインに新しい顧客を設定するプロセスは、リソースとしてモデル化できます。 CRUDは、ほとんどすべてのリソースに適用可能な最小限のビジネスプロセスです。 これにより、ビジネスプロセスを、それ自体で追跡できる真のリソースとしてモデル化できます。


つまり Rocket Launchリソースの作成は正しいものになります。
次に、POSTがロケットを起動し、GETがプロセスのステータスを認識し、DELETEがキャンセルします。 同時に、一貫性が維持されます。 ロケットはすでに飛行しており、国のステータスは「まだ存在しています」。

ボーナス:

多くの大企業はRESTが何であるかわからないことがわかり、この名前は説明で使用されています。 そのため、大規模な人々 あっても、フェンスに書かれているものすべてを信頼することはできません。

Achtungsの例:


GitHubを発見できた唯一のまともなREST API。 アーメン

Source: https://habr.com/ru/post/J251193/


All Articles