4

私はRESTAPIを設計していますが、リソースの更新を処理するための推奨される方法は何でしょうか。具体的には、リソースでの更新を許可しますが、リクエストPUTの本文で何を許可する必要がありますか?PUT

  1. 常にリソースの完全な構造ですか?
  2. リソースの構造の(変更された)サブパートは常にありますか?
  3. 両方の組み合わせ?

たとえば、リソースを取得しhttp://example.org/api/v1/dogs/packs/p1ます。このリソースのAGETは、次のようになります。

Request:
GET http://example.org/api/v1/dogs/packs/p1
Accept: application/xml

Response:
<pack>
  <owner>David</owner>
  <dogs>
    <dog>
      <name>Woofer</name>
      <breed>Basset Hound</breed>
    </dog>
    <dog>
      <name>Mr. Bones</name>
      <breed>Basset Hound</breed>
    </dog>
  </dogs>
</pack>

犬(Sniffers the Basset Hound)をパックに追加したい場合、次のいずれかをサポートしますか?

Request:
PUT http://example.org/api/v1/dogs/packs/p1
<dog>
  <name>Sniffers</name>
  <breed>Basset Hound</breed>
</dog>

Response:
HTTP/1.1 200 OK

また

Request:
PUT http://example.org/api/v1/dogs/packs/p1
<pack>
  <owner>David</owner>
  <dogs>
    <dog>
      <name>Woofer</name>
      <breed>Basset Hound</breed>
    </dog>
    <dog>
      <name>Mr. Bones</name>
      <breed>Basset Hound</breed>
    </dog>
    <dog>
      <name>Sniffers</name>
      <breed>Basset Hound</breed>
    </dog>
  </dogs>
</pack>

Response:
HTTP/1.1 200 OK

または両方?構造のサブセクションを通じて更新をサポートすることが推奨されている場合、削除(犬が死亡したときなど)をどのように処理しますか?クエリパラメータを介して?

4

2 に答える 2

8

はい、常にリソースの完全な表現を送信してください。それ以外の場合は、(PUTの一般的な定義と使用法に従って)パックをこの1匹の犬と交換します。

ただし、次のことを検討することをお勧めします。

  • URLパスのでXML名前空間または他のバージョン管理手段(例:?version = 2)を使用する
  • 追加する犬を/dogs/ packs/p1にPOSTします。定義上、POSTは従属リソースを作成するため、犬がパックに追加されます。
  • URLを少し更新します。本当に/dogs/ 1234、/ dogs / 1235など、次に/ packs / p1、/ packs/p2が必要なようです。<dog id="1">次に、パックにPOSTすることもできます。

RESTでは、リソースを適切に識別する必要があることに注意してください。パックは実際には犬の従属リソースではなく、各犬はある種の一意の識別子を持っている必要があります。次に、/ packs / p1 / 1234にアクセスするときに、おそらく/ dogs/1234にリダイレクトする必要があります。または、それぞれのパックへの従属リソースのPOSTを受け入れているにもかかわらず、そのURLを使用可能にしないこともできます。

考えれば考えるほど、POSTアプローチの意味がわかります。パックとは別に、すべての犬用の/ packs / p1 /dogs/リソースを用意することもできます。次に、所有者情報などを/ packs / p1に配置し、/ packs / p1 / dogs /を介してすべての犬のリストを取得できます(パック内の各犬のURLのリストが含まれている必要があります(例:/ packs / p1))。 / dogs / 1234、HATEOASを参照)、/ packs / p1 / dogs /にPOSTして新しい犬をパックに追加し、/ packs / p1 / dogs/1235を削除して犬を削除します。各犬は、/ dogs / 1234などへのリダイレクトを含む完全な表現、またはこのパックのコンテキストでの犬の異なる表現のいずれかである可能性がありますが、ここでも「完全な」犬へのリンクがあります。パック内の1匹の犬をどのように表現したいかによって異なりますが、もちろんそれも影響します実際に/packs/ p1 /dogs/に投稿するもの。完全な犬は気分が悪いです。上で示したように、実際には単なるIDである必要があります。おそらく、パックとの関係に関連する追加のデータが含まれています。

于 2010-04-27T09:56:14.040 に答える
2

PUTの効果は「置換」です。したがって、はい、PUTリクエストで完全な表現を提供する必要があります。

リソースの一部のみを更新する場合は、次の選択肢があります。

  • パーツを表すリソースを定義し、そこに配置します
  • サブリソースへのPOSTを使用して、サーバーに303を返してもらいます。メインリソースを指すLocationヘッダーを持つ「その他」を参照してください。
  • PATCHを使用する

あなたの場合、犬をサブリソース(パックの犬のコレクション)にして、通常の追加後の方法でそれにPOSTするのがおそらく最善でしょう。

于 2010-04-27T09:42:07.293 に答える