9

各状態がハイパーリンクされるべきであるという HATEOAS の原則に従って、リソースの状態を変更するリンクをモデル化する最良の方法は何ですか?

注文の古典的な例を見てみましょう:

{
   id : 12,
   state: 'pending',
   ...,
   links: [
     ...,
     { 
       rel: 'cancel',
       href: '/orders/12/cancel'
     },
     ...
   ]
}

「/cancel」の部分にはまったく満足していません。次の内容で「 PUT」リクエストを送信できれば、もっと気分が良くなるでしょう。

{
   status:'cancelled'
}

しかし、リンクセクションの「href」属性でそれを表現するにはどうすればよいですか? たとえば、注文のキャンセルは常に可能であるとは限らないため (「完了」状態)、そこで利用可能なアクションを表現したいと思います。

1 つの可能性は、'/orders/12?action=cancel' のような URL を使用することです。これは、RPC アプローチのように感じられ、何かが欠けているように感じます。

おそらく最も見栄えの良い別の可能性は、次のようなリンクを持つことです。

{
  rel: 'cancel',
  href: '/orders/12/',
  type: 'PUT',
  values: {
    state: 'cancelled'
  }
}

この解決策は少し冗長に感じるかもしれません。

それを優雅に処理する方法はありますか?たぶん、誰かがすでに同様の「問題」を解決していますか?

4

4 に答える 4

1

何らかの方法でフォームを記述する必要があります。あなたの「冗長な」ソリューションは完全に問題ありません:

{
  rel: 'cancel',
  href: '/orders/12/',
  type: 'PUT',
  values: {
    state: 'cancelled'
  }
}

注: カスタム MIME タイプを定義するか、フォームを記述できる汎用 MIME タイプ (コレクション + json など)、または RDF タイプ (Hydra などの REST ボキャブをサポートする) を使用する必要があります。統一されたインターフェース / 自己記述的なメッセージ

たとえば、注文のキャンセルは常に可能であるとは限らないため (「完了」状態)、そこで利用可能なアクションを表現したいと思います。

操作が利用できない場合は、その操作を指すリンクを送信しないでください。

于 2013-10-07T07:25:20.800 に答える
0

この2つのモデルのどちらかをお勧めします。最初のものは古典的なものですが、rel="edit-form"利用PATCH可能な場合は使用します。2 つ目は、HTTP リソース モデルがアプリケーション ドメイン モデルにどのようにマッピングされるか (つまり、2 つが 1:1 マッピングである必要はないということ) について横方向の考え方から生じる代替案です。


解決策 1

リソースをその場で編集します。

HTML互換:

HTTP/1.1 200 OK
Content-Type: text/html
Location: /orders/1/

...<a rel="edit-form" href="./edit">Edit</a>...

 

HTTP/1.1 200 OK
Content-Type: text/html
Location: /orders/1/edit

...
<form action="../" method="POST">
    <input type="hidden" name="_METHOD" value="PATCH">
    <button type="submit" name="status" value="cancelled">Cancel Order</button>
</form>
...

 

POST /orders/1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded

_METHOD=PATCH&status=cancelled

リッチ クライアント (HTML+Javascript など) との互換性:

PATCH /orders/1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded

status=cancelled

および/または

PATCH /orders/1 HTTP/1.1
Content-Type: text/json

{
    "status": "cancelled"
}

キーは、_METHODHTML が HTTP をサポートしていないため、REST フレームワークに正しいメソッドを提供する手段としてよく知られています。


解決策 2

または、リソースを削除します (ついでに、新しいリソースを作成します)

DELETE /orders/1 HTTP/1.1

 

HTTP/1.1 201 Created
Location: /cancelled-orders/1

Web リソースをドメイン オブジェクトにマッピングするこの方法の詳細については、同様の質問に対する私の回答を参照してください。

あなたが読みたいかもしれない別の答えはthis oneです。

于 2013-07-21T09:55:52.900 に答える