同一効力
RFCに従って、PUTは完全なオブジェクトをリソースに配信する必要があります。この主な理由は、PUTがべき等であるべきだということです。これは、サーバー上で同じ結果を評価するために繰り返される要求を意味します。
部分的な更新を許可する場合、それはもはや同効ではありません。2つのクライアントがある場合。クライアントAとBの場合、次のシナリオが進化する可能性があります。
クライアントAは、リソースイメージから画像を取得します。これには、画像の説明が含まれていますが、これはまだ有効です。クライアントBは新しいイメージを配置し、それに応じて説明を更新します。画像が変更されました。クライアントAは、説明を変更する必要がないことを確認しました。これは、希望どおりであり、画像のみを配置するためです。
これにより矛盾が発生し、画像に間違ったメタデータが添付されます!
さらに厄介なのは、仲介者がリクエストを繰り返すことができることです。何らかの理由でPUTが失敗したと判断した場合。
PUTの意味は変更できません(誤用することはできますが)。
別のオプション
幸い、別のオプションがあります。これはPATCHです。PATCHは、構造を部分的に更新できるメソッドです。部分的な構造を送信するだけです。単純なアプリケーションの場合、これで問題ありません。この方法は、強力であるとは限りません。クライアントは、次の形式でリクエストを送信する必要があります。
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
また、サーバーは204(コンテンツなし)で返信して成功を示すことができます。エラー時には、構造の一部を更新できません。PATCHメソッドはアトミックです。
この方法の欠点は、すべてのブラウザーがこれをサポートしているわけではないことですが、これはRESTサービスの最も自然なオプションです。
パッチリクエストの例:
http : //tools.ietf.org/html/rfc5789#section-2.1
JSONパッチ
jsonオプションはかなり包括的で興味深いオプションのようです。ただし、サードパーティ向けに実装するのは難しい場合があります。ユーザーベースがこれを処理できるかどうかを判断する必要があります。
また、コマンドを部分構造に変換する小さなインタープリターを作成する必要があるため、モデルを更新するために使用するため、多少複雑です。このインタープリターは、提供されたコマンドが意味をなすかどうかもチェックする必要があります。一部のコマンドは互いにキャンセルします。(fieldaの書き込み、fieldaの削除)。これをクライアントに報告して、クライアント側のデバッグ時間を制限したいと思います。
しかし、時間があれば、これは本当にエレガントなソリューションです。もちろん、フィールドを検証する必要があります。これをPATCHメソッドと組み合わせて、RESTモデルにとどめることができます。しかし、ここではPOSTは受け入れられると思います。
悪くなる
PUTオプションを使用することにした場合、これは多少危険です。その後、少なくともエラーを破棄しないでください。ユーザーには一定の期待値があり(データが更新されます)、これを破ると、一部の開発者に良い時間を与えないことになります。
フラグを立てるには、409 Conflictまたは403 Forbiddenを選択できます。更新プロセスの見方によって異なります。ルールのセット(システム中心)として見ると、競合はより良くなります。これらのフィールドは更新できません。(ルールと矛盾します)。承認の問題(ユーザー中心)として見られる場合は、forbiddenを返す必要があります。With:これらのフィールドを変更する権限がありません。
ユーザーにすべての変更可能なフィールドを送信するように強制する必要があります。
これを強制する合理的なオプションは、変更可能なデータのみを提供するサブリソースに設定することです。
個人的な意見
個人的には、ブラウザで作業する必要がない場合は単純なPATCHモデルに行き、その後JSONパッチプロセッサで拡張します。これは、MIMEタイプを区別することで実行できます。JSONパッチのMIMEタイプ:
application / json-patch
そしてjson:application / json-patch
2つのフェーズで簡単に実装できます。