非CRUD操作を処理するREST APIを設計する方法は?


11

SOAPベースのサービスのセットをRESTful APIに変換しようとしています。

オペレーション名を分析してリソースを識別することから始め、リソースを取得しましたSubscription

サブスクリプションの状態を更新する必要がある場合POST、リソースに直接アクセスできないため、サーバーに単純に要求を送信することはできませんが、RPCスタイルの操作を呼び出してプロパティを更新する必要があります。さらに、サブスクリプションの状態を「アクティブ」に変更する場合にのみ、外部サービスへの追加の呼び出しが必要です。

これらの場合、基礎となる操作を処理するためのベストプラクティスは何ですか?

私が思いついた解決策は、クエリパラメータを使用することです。そのため、アクティベーションサービスを呼び出す必要がある場合は、次のようなものを使用できます。

POST /subscriptions/{subscriptionid}/?activate=true

Subscriptionオブジェクトのフィールドを直接更新できないことを考えると、この種の変換を処理するベストプラクティスはありますか?

更新1:

POSTリクエストの本文にいくつかの値、たとえば「state」:「active」を入れることができます

サービス内でトリガーされる適切な操作を確認します。


HTTP動詞へのRESTのコマンドのマッピングは、複雑な操作で失敗します。あなただけのRPCスタイルの呼び出しPOST activateSubscriptionをやってより良いオフになっている/ {ID}ノー・ワンは、それによって混同します
ユアン

@EwanこれがRESTfulモデルに準拠しているかどうかはわかりませんが、別の解決策を思い付きました:私のコードでは、入力ペイロードに従って適切なRPCスタイルの操作を呼び出すことができます(私の投稿リクエスト、コードはアクティベーションコードを呼び出します)
-Vektor88

1
このような既存のリソースの更新はPATCHである必要があり、クエリの本体は変更対象の部分的なモデルになります。POSTは、リソースを作成するリクエストと見なされます。この区別は、ユーザーにわかりやすくすることとは別に、リソースポストではなく、この操作がいつ行われるかをコードが簡単に認識できるようにします。
コチェッセ氏16年

1
@ Vektor88通常、ただし、これらはべき等の操作であり、リソース状態の表現全体を渡す必要があります。このユースケースは、部分更新にはるかに近いようで、PATCHに非常によく適合します。
コッチェ氏16年

1
@MrCochese POSTはべき等ではありません。
ジミージェームズ

回答:


8

あなたは監視する必要があり、この話をジム・ウェバーによる。

サブスクリプションの状態を更新する必要がある場合、リソースに直接アクセスできないため、サーバーに単純にPOST要求を送信することはできませんが、RPCスタイルの操作を呼び出してプロパティを更新する必要があります。さらに、サブスクリプションの状態を「アクティブ」に変更する場合にのみ、外部サービスへの追加の呼び出しが必要です。

「メッセージング」を考えてください。ドメインにメッセージを送信して、発生したいことを説明します。メッセージの副作用は、ドメインモデルが実際に状態を変更することです。「リソース」はメッセージキューです。

POST /subscriptions/{subscriptionid}/?activate=true

リソース名のスペルは、マシンにとって重要ではありません。しかし、使用する識別子がリソースが「名詞」であるという慣習から外れると、人々はうるさくなりがちです。

また、私たちはに従属するリソースについて話している/subscriptions/{subscriptionid}ので、規約(RFC 3986を参照)は、クエリ部分を使用するのではなく、パスセグメントでその関係を表現することを要求します。

したがって、これらのスペルは妥当かもしれません

POST /subscriptions/{subscriptionid}/messages
POST /subscriptions/{subscriptionid}/activations

1
ジムウェバーの講演は、youtube.com
watch?v

0

ものを有効化/無効化するブールフラグの場合、デフォルトはJSONを使用することです:

POST /subscriptions/{subscriptionid}/
{
    format: 0,
    subscription: 
    {
        active: false
    }
}

より多くのプロパティをサポートする場合、これは簡単に拡張できます。別のアプローチは、独自のエンドポイントを与えることです:

POST /subscriptions/{subscriptionid}/active/
DELETE /subscriptions/{subscriptionid}/active/

個人的には、activeこのイベントの状態に、ユーザーIDや設定など、JSONで渡す/取得できるプロパティが必要である場合にのみこれを使用します。

ブール値ではなく、トリガーする必要があるがステータスフィードバックを必要としない/ただちに実行するアクション(即時200 OKを除く)の場合、次のようなエンドポイントを使用してRPCのようにトリガーします。

POST /subscriptions/{subscriptionid}/activate/

疑問がある場合は、これをお読みくださいhttp : //www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#restful(「CRUD操作の世界に適合しないアクションはどうですか? ")


0

RESTは機能しません。Activateは動詞であり、状態になることはできませんActive。状態です。

RESTfulは機能しないため、RESTfulサービスに何をすべきかを伝えることはできませんが、サービスのキューに作業を追加することはできます。

こちらをご覧ください:

PUT /subscriptionQueue
subscriptionId={subscriptionId}
active=true

この要求はRESTfulであり、RESTfulのすべての利点(パフォーマンス、酸など)をサポートします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.