SOAPベースのサービスのセットをRESTful APIに変換しようとしています。
操作名を分析してリソースを特定することから始め、リソースSubscription
を取得しました。
サブスクリプションの状態を更新する必要がある場合、POST
リクエストをサーバーに送信することはできません。これは、リソースに直接アクセスできないためですが、RPCスタイルの操作を呼び出して、プロパティを更新します。さらに、サブスクリプションの状態を「アクティブ」に変更する場合にのみ、外部サービスへの追加の呼び出しが必要です。
これらの場合、基になる操作を処理するためのベストプラクティスは何ですか?
私が思いついた解決策は、クエリパラメータを使用することです。これにより、アクティベーションサービスを呼び出す必要がある場合は、次のようなものを使用できます。
POST /subscriptions/{subscriptionid}/?activate=true
Subscriptionオブジェクトフィールドを直接更新できないことを考慮して、この種の変換を処理するためのベストプラクティスはありますか?
更新1:
POSTいくつかの値を要求します。たとえば、 "state": "active"のボディに入れることができます
自分のサービス内でトリガーされる適切な操作を確認します。
ジムウェバーによる この講演 を見る必要があります。
サブスクリプションの状態を更新する必要がある場合、POSTリクエストをサーバーに送信することはできません。リソースに直接アクセスできないためですが、RPCを呼び出す必要があります。また、サブスクリプションの状態を「アクティブ」に変更する場合にのみ、外部サービスへの追加の呼び出しが必要です。
「メッセージング」を考えてください。ドメインにメッセージを送信して、発生したいことを説明します。メッセージの副作用は、ドメインモデルが実際にその状態を変更することです。 「リソース」はメッセージキューです。
POST /subscriptions/{subscriptionid}/?activate=true
リソース名のスペルはマシンには関係ありません。しかし、使用する識別子がリソースが「名詞」であるという慣習を破ると、人々は煩雑になる傾向があります。
また、/subscriptions/{subscriptionid}
に従属するリソースについて話しているため、規則( RFC 3986 を参照)は、クエリ部分を使用するのではなく、パスセグメントとの関係を表現することを求めています。
したがって、これらのスペルは妥当かもしれません
POST /subscriptions/{subscriptionid}/messages
POST /subscriptions/{subscriptionid}/activations
ブールフラグを有効化/無効化する場合、デフォルトでは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運用の世界に?」)
RESTは機能しません。 Activate
は動詞であり、状態であってはなりません。Active
は状態です。
RESTfulは機能しないため、RESTfulサービスに何をすべきかを伝えることはできませんが、サービスのキューに作業を追加することはできます。
これを見てください:
PUT /subscriptionQueue
subscriptionId={subscriptionId}
active=true
このリクエストはRESTfulであり、RESTfulのすべての利点(パフォーマンス、酸など)をサポートします