2016-09-12 4 views
1

私は、私のAPIにHATEOASを実装する方法(もしあれば)を頭に入れようとしています。私は現在の状況で適切なアクションだけをクライアントに与えるというコンセプトの1つが好きです。しかし、私はこのアイデアを正しく実装しているかどうかはわかりません。HATEOASとリンク/アクション

のは、私は変更することができる状態でリソースタイプがあるとしましょう、それは別のステータスを持つことができます(処理が成功し、期限切れ、を拒否し、を受け入れました)。次のjsonオブジェクトを作成する必要があります:

{ 
    ... 
    "links": { 
     "accept": "http://example.com/order/1/accept", 
     "decline": "http://example.com/order/1/decline" 
    } 
} 

ここで不要なアクションを作成していますか?そして上記が正しい場合は、ステータスをPATCHまたはGETで変更する必要がありますか?それがパッチだったら、どのようにして(ハイパーメディアの目的を破って)知っていますか?

編集:だが、私は変更することができる状態とリソースタイプの順序を持​​っているとしましょう注文ID

答えて

4

を追加するのを忘れ、それは異なるステータス(処理、受け入れを持つことができ、減少しましたが、成功した有効期限が切れ)。

警告:ドメインがドキュメント管理である場合を除き、ドメインのコンセプトにリソースを照合しようとすると、自分自身が複雑になる可能性があります。 Jim Webber warned about this years ago;ほとんどの場合、リソースは統合ドメインの一部です。彼らはあなたのドメインモデルとやりとりするために使用される紙の小さなデジタルです。

{ 
    ... 
    "links": { 
     "accept": "http://example.com/order/accept", 
     "decline": "http://example.com/order/decline" 
    } 
} 

ここでの基本的な考えはうまくいきます - クライアントが受け入れプロトコルを呼び出そうとする場合、使用するリンクを知っています。同様に拒否プロトコルのために。それ以外の場合は、リンクが利用できないため、クライアントは実行しようとすべきではないことを知っています。例えば、クライアントの目標が注文を失効させることであった場合、それは行き詰まっていたことを知るだろう。

URIのスペルは少し奇妙です。クライアントはスペルを気にする必要はありませんが、要求はステートレスでなければなりません。注文がタイプののリソースの場合、どの注文を受け入れ/却下するか

上記の内容が正しい場合は、ステータスをPATCHまたはGETで変更する必要がありますか?

どちらもありません。

は、リソースがGETサポート広告操作が仲介コンポーネントは投機的リンク、クライアントの時間を節約するために、プリロード結果をたどることができることを意味し、安全であるという主張であるのでは、間違ってGET。どのようなあなたは二つの問題がありクライアント

PATCHによる決定を伝えるメッセージを理解している場合はやっているしたくありません。まず、ドキュメントの操作用に設計されています。アプリケーションがドキュメントデータベースの場合、PATCHは1つまたは複数のスコープ変更を行うことができます。しかし、ビジネスモデルの代理表現を扱うにはあまり適していません。クライアントがインテントをサーバーに伝達するのではなく、クライアントは、そのインテントが表現に与える副作用を通信し、サーバーはインテントを副作用から推測しようとします。

しかし、あなたはそれを回避する可能性があります。結局のところ、サポートするメディアタイプを選択することができ、クライアントの意図を表現できるようなタイプに制限される可能性があります。

2番目の問題は、PATCHが冪等でないことです。 POSTと同じ障害モードがあります。要求がサーバーによって確認応答されない場合、クライアントは要求を再試行しても安全かどうかをすぐに判断できません。

簡単な方法は、注文54321が受け入れられるべき誰かの受信トレイに

を手書きのメモを置くことに類似して編集を考えることです。それを済ませてください。 署名されたクライアント。

つまり、オーダーリソースを直接操作するのではなく、オーダーを操作する副作用を持つ受信トレイにメモを配信しています。クライアントは必要な変更について説明し、サーバーは変更を行います(サーバーが自律性を持つことを許可している場合)。

この手法では、PUT(冪等)またはPOST(適切ではない)が適切です。実際には、受信トレイコレクションに新しいメッセージを追加し、そのイディオムを使用して適切な方法を選択することができます。

もしそれがパッチだったら、どのように(ハイパーメディアの目的を破って)知っていますか?

クライアントは「リンク」プロパティでリンクを探す方法を知っていますか?

ブラウザはHTML文書内のリンクをどうすればよいか知っていますか?

答えは次のとおりです。あなたはメディアタイプ自体を設計する際に多大な労力を費やしています。ウェブの場合、text/htmlメディアタイプの設計に多大な時間と努力が費やされていたので、htmlを念頭に置いて設計されたクライアントは、その理解を共有するサーバによって生成された表現を消費することができます。クライアントとサーバーは互いに分離されていますが、共通の共通点を共有しています。

HTMLの場合、ほとんどの場合、メディアタイプはリンクに関連付けられたHTTPメソッドを定義します(例外はフォームであり、表現は制限付きセットからメソッドを指定できます)。巨人の肩に立つ。

+0

あなたの徹底的な対応に感謝します(私が正しいリソースIDを追加するのを忘れてしまった)。上から読んで、PATCHを選択します。パッチのjsonペイロードは何ですか?何かが好きです:PATCH:http://example.com/order/1/accept {status: "accept"}? – adnan

+0

いいえ、私は新しいリソースをPUTします。 PATCHする必要がある場合は、PATCHのメディアタイプを選択する必要があります。おそらく:https://tools.ietf.org/html/rfc6902 – VoiceOfUnreason

+0

ああ、あなたを誤解して申し訳ありません。したがって、PUT:payload {status: "accept"}を指定したexample.com/order/1/acceptあるいは、別のペイロードをお勧めしますか? – adnan

関連する問題