web-dev-qa-db-ja.com

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

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

操作名を分析してリソースを特定することから始め、リソースSubscriptionを取得しました。

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

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

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

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

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

更新1:

POSTいくつかの値を要求します。たとえば、 "state": "active"のボディに入れることができます

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

11
Vektor88

ジムウェバーによる この講演 を見る必要があります。

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

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

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

リソース名のスペルはマシンには関係ありません。しかし、使用する識別子がリソースが「名詞」であるという慣習を破ると、人々は煩雑になる傾向があります。

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

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

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

ブールフラグを有効化/無効化する場合、デフォルトでは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
Barry Staes

RESTは機能しません。 Activateは動詞であり、状態であってはなりません。Activeは状態です。

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

これを見てください:

PUT /subscriptionQueue
subscriptionId={subscriptionId}
active=true

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

0
Peter Rader