2011-02-09 7 views
28

私はRESTfulなAPIを実装する途中ですが、変更できないデータが存在するかどうかについて 'コミュニティで受け入れられた'動作が不明です。たとえば、私のAPIには、ファイルのバイナリデータやそれに関連するいくつかのメタデータなど、作成後に変更できないいくつかのフィールドが作成された 'ファイル'リソースがあります。さらに、「ファイル」には説明が書き込まれ、タグが関連付けられます。RESTfulなAPI設計:更新(PUT)内の変更不可能なデータはオプションであるべきですか?

私の質問は、これらの「ファイル」リソースのいずれかへの更新を行うことに関係しています。特定の 'ファイル'のGETは、ファイルに関連付けられたタグ&のタグとファイルのバイナリデータをすべて返します。特定の 'ファイル'リソースのPUTに '読み取り専用'フィールドが含まれている必要がありますか?私は、どちらかの方法でコード化できることを認識しています:a)PUTデータに読み取り専用フィールドを含め、元のものと一致するかどうかを確認するか、エラーを出します。b)PUTデータの読み取り専用フィールドの存在を無視します。ロジックが変更を無視するため、一致しないか、または存在しない場合、エラーを発行することはありません。

どちらかといえば受け入れられるようです。読み取り専用フィールドを無視する2番目の方法は、コンパクトにすることができます。なぜなら、APIクライアントは、必要に応じて読み取り専用データの送信をスキップできるからです。彼らが何をしているのかを知っている人には良いようです...

+1

ちょうど注記:Roy Fieldingは、PUTは部分的な更新には使用されないと言います。 http://tech.groups.yahoo.com/group/rest-discuss/message/17421部分的な更新については、POSTを使用してください。 PUTは、指定されたURLのリソースを置換*するために使用されます。参照:http://stackoverflow.com/a/2443344/48082 http://stackoverflow.com/a/2391954/48082 – Cheeso

答えて

15

個人的に、両方の方法が受け入れられます....しかし、もし私があなただったら、私はオプションAを選ぶでしょう。変更されず、エラーが発生します)。あなたのプロジェクトの範囲によっては、経験豊富なWSDLであっても、ほとんどの人がドキュメントやWADLを読んでいないため、安心してWSを深く理解することはできません。 :)

特定のフィールドが読み取り専用であるというコンシューマに即時のフィードバックを提供しない場合、Webサービスがダブルチェックなしで行ったすべての変更に注意を払うという誤った仮定があります。OR "矛盾した"アップデートを見つけたら、彼らはあなたのウェブサービスがバグであると他の人に訴える。

あなたは、読み取り専用フィールドには、元の値に一致しない場合は...

  1. が要求を処理しない2つの異なる方法でこれに近づくことができます。 409競合コードと特定のエラーメッセージを送信します。
  2. 要求を処理し、200 OKと、読み取り専用フィールドの変更が無視されたことを示すメッセージを送信します。
15

読み取り専用データがデータのかなりの部分を占めていない限り(読み取り専用データを送信することがネットワークトラフィックと応答時間に顕著な影響を与えない限り)、 PUT内の読み取り専用フィールドに変更をチェックします。同じデータを出し入れする方が簡単です。

PUTにオプションの読み取り専用フィールドを含めることもできますが、受け取った読み取り専用フィールドにはコードが含まれていることを確認するために、コードをサービスに書き込む必要があります。期待値。あなたはどちらかの方法で読み取り専用チェックを書く必要があります。

PUTの読み取り専用フィールドを禁止することは、クライアントがGETで受け取ったフィールドを取り除く必要があるため、悪い考えです。これには、クライアントが実際に必要とするよりも、データやセマンティクスにもっと密接に関わる必要があります。クライアントは、これを頭痛、不要な合併症、そしてあなたの負担を増やすことを意味すると考えます。あなたのGETから受け取ったデータを取って、関心のある分野を修正し、PUTで​​それをあなたに送り返すことは、脳死の単純な往復のクライアントでなければなりません。あなたがする必要がないときには、物事を複雑にしないでください。