2011-01-12 12 views
2

RESTfulサービスでJSONを使用しています。実装はこのようなものです。 http://hostname/aRESTfulサービスで複合型を部分的に更新する

{ 
    "a": { 
     "b": { 
      "c1": "newdata" 
     } 
    } 
} 

http://hostname/aリターンにGET

{ 
    "a": { 
     "b": { 
      "c1": "data1", 
      "c2": "data2" 
     } 
    } 
} 

私はPOSTの正しい動作を知っている(とPUT)したかったhttp://hostname/a/b戻っ

{ 
    "b": { 
     "c1": "data1", 
     "c2": "data2" 
    } 
} 

のGETは万一c1を値 "newdata"またはそれだけで更新するリソース全体を置き換えて、それだけでc1を含む(つまり、c2は上書きされ、もう存在しない)

答えて

2

あなたは過去数年間にわたって私がRESTを扱っていた時に見た最も議論の深い問題の1つに当たっています。

単純な答えは次のとおりです。
一般的なコンセンサスは、HTTP PUTメソッドがセマンティクスを置き換えるため、c2が上書きされ、もう存在しないということです。
PATCHメソッドは最近、人々が部分的な更新を扱うのを助けるために導入されました。

ここで、シナリオの2つの複雑さがあります。
1)PUTにセマンティクスを置き換える必要があるのはなぜですか?部分的な更新を行うことによる悪影響は何ですか?私はまだ本当に説得力のある議論を聞いていない。

実際には、特にPUT言っていないHTTPの仕様では、セマンティクスを置き換えるあり、それsays

囲まれた表現が

URI

効果的な要求で保存することがPUTメソッドのリクエストしかし、それはまた言っています

HTTP/1.1はどのようにPUTを定義していません メソッドは、オリジンの状態に影響します サーバー。

2)置き換えられていない表現にサーバーがコンテンツを含む可能性があるとPUTが置き換えていると仮定すると、受け入れられます。例えば表現にリンクが含まれている場合、それらのリンクを含まない表現のPUTを実行しても、それらのリンクは「削除」されません。タイムスタンプフィールド、または最後に変更されたデータと同じです。永遠の疑問は、クライアントが省略したときに削除されるコンテンツと、サーバーがそうしているために残されるコンテンツをどのように定義するかです。

個人的には、「置換」セマンティクスが拘束されすぎているため、私はPUTを避けました。しかし、最近私は、Mike KellyMike Amundsenによって、おそらくPUTは、私たちが現在信用できるものよりも柔軟性があると考えられるようになり始めています。

+0

私は部分的な更新がないという説得力のある理由は聞かなかったので、この問題が発生しました。私は唯一説得力のある理由は、それがより多くの作業を加えることができるということです。第2のポイントは、クライアントが省略したときに削除されないフィールドをいくつか持つことができるためです。 – Hardy

1

まず、 'b'リソースを変更すると、POST(またはPUT)をhttp://hostname/a/bの代わりにhttp://hostname/aの代わりに?指し示すべき/リンクされる価値のあるものがあれば、それはリソースとして実装されるべきであり、RIA哲学によればそれ自体のURIを持っている。

+0

PUTをaまたはbのどちらにしても問題は同じです –

+0

上記は単なる例です。私たちのケースでは、c1は一連の設定のための有効フラグです。だから、まだ設定を有効にしているときは、有効なフィールドセットをtrueにするだけでいいのですか? – Hardy

0

http://hostname/aにPUTすると、http://hostname/a/bのキャッシュされたコピーはどうなりますか?どれくらいの時間が同期できないのですか?

答えが「キャッシュされていません」...の場合は...?

"レイヤードシステムの主な欠点は、データ処理にオーバーヘッドとレイテンシが加わり、ユーザーが知覚するパフォーマンスが低下することです。キャッシュ制約をサポートするネットワークベースのシステムでは、これは共有仲介者にキャッシュする " - 有名な論文。

+0

すぐに無効にすることができます:http://restafari.blogspot.com/2010/04/link-header-based-invalidation-of.html –

関連する問題