web-dev-qa-db-ja.com

なぜPATCHメソッドはべき等ではないのですか?

私はこれについて疑問に思っていました。

userフィールドとidフィールドを持つnameリソースがあるとします。フィールドを更新したい場合は、次のようにリソースに対してPATCHリクエストを実行できます

PATCH /users/42
{"name": "john doe"} 

そして、アプリケーションはユーザー42の名前を更新します。

しかし、このリクエストを繰り返すと結果が異なるのはなぜですか?

RFC 5789 によると

PATCHは安全でもべき等でもありません

54
mattecapu

PATCHリクエストcanはべき等にすることができますが、そうする必要はありません。それが非べき等として特徴付けられる理由です。

PATCHがべき等であるかどうかは、必要な変更がどのように伝達されるかに大きく依存します。
たとえば、パッチの形式が{change: 'Name' from: 'benjamin franklin' to: 'john doe'}の場合、最初の要求以降のPATCH要求は、最初の要求とは異なる効果(失敗応答)を持ちます。
非べき等性のもう1つの理由は、元のリソース以外の何かに変更を適用すると、リソースが無効になる可能性があることです。これは、変更を複数回適用する場合にも当てはまります。

べき等ではないPATCHがRFC 5789の次の段落である場合の明確な答えは次のとおりです。

パッチ形式が既知の基点から動作する必要がない場合もあります(たとえば、ログファイルにテキスト行を追加する、またはデータベーステーブルに競合しない行を追加する)。この場合、クライアント要求での同じ注意は必要ありません。 。

RFCではパッチにリソースへの「一般的な変更」が含まれていると規定されているため、通常のフィールド置換だけではありません。リソースがカウンター用である場合、パッチはその増分を要求できますが、明らかにべき等ではありません。

12
Ivan