PATCHリクエストとPUTリクエストの主な違いは何ですか?


187

PUTRailsアプリケーションでリクエストを使用しています。現在、新しいHTTP動詞PATCHがブラウザーによって実装されています。ですから、PATCHPUTリクエストの主な違いは何か、そしてどちらを使うべきかを知りたいのです。

回答:


139

HTTP動詞は、おそらくHTTPプロトコルの最も謎めいたものの1つです。それらは存在し、それらは多数ありますが、なぜそれらが存在するのですか?

Railsは多くの動詞をサポートし、Webブラウザーでネイティブにサポートされていないいくつかの動詞を追加したいようです。

http動詞の完全なリストは次のとおりです。http://annevankesteren.nl/2007/10/http-methods

公式RFCのHTTPパッチ:https : //datatracker.ietf.org/doc/rfc5789/?include_text=1

PATCHの要求エンティティに説明する変更のセットが要求- URIで識別されるリソースに適用されることが方法を要求します。変更のセットは、メディアタイプによって識別される「パッチドキュメント」と呼ばれる形式で表されます。Request-URIが既存のリソースを指していない場合、サーバーは、パッチドキュメントタイプ(nullリソースを論理的に変更できるかどうか)や権限などに応じて、新しいリソースを作成できます(MAY)。

PUT要求とPATCH要求の違いは、サーバーが囲まれたエンティティを処理してRequest-URIで識別されるリソースを変更する方法に反映されます。でPUTの要求、囲まれたエンティティはオリジンサーバ上に格納されたリソースの修正バージョンであると考えられ、そしてクライアントは、格納されたバージョンを交換することを要求されます。ではPATCH、しかし、囲まれたエンティティは、現在、オリジンサーバ上にあるリソースは、新しいバージョンを生成するように変更する必要がある方法を記述する一連の命令が含まれています。PATCHの 方法はで識別されるリソースに影響のRequest-URIを、そしてそれはまた、 MAY他のリソースに副作用があります。つまり、PATCHを適用することにより、新しいリソースを作成したり、既存のリソースを変更したりできます。

私の知る限り、PATCH動詞はRailsアプリケーションのように使用されていません...これを理解しているように、RFCパッチ動詞を使用して、2つのファイル間でdiffを実行するときのように、パッチの指示を送信する必要があります。エンティティ全体を再送信する代わりに、エンティティ全体を再送信するよりもはるかに小さいパッチを送信します。

巨大なファイルを編集したいとします。3行を編集します。ファイルを送り返す代わりに、差分を送信する必要があります。プラス面として、パッチリクエストの送信を使用して、ファイルを非同期にマージできます。バージョン管理システムは、潜在的にPATCH動詞を使用してリモートでコードを更新できます。

もう1つの考えられる使用例は、NoSQLデータベースにいくらか関連しており、ドキュメントを格納することが可能です。JSON構造を使用して、サーバーとクライアントの間でデータを送受信するとします。フィールドを削除したい場合は、$ unsetにmongodbの構文と同様の構文を使用できます。実際、mongodbでドキュメントを更新するために使用される方法は、おそらくjsonパッチの処理に使用できます。

この例をとります:

db.products.update(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)

私たちはこのようなものを持つことができます:

PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }

最後に重要なことですが、人々はHTTP動詞について好きなように言うことができます。真実は1つだけあり、真実はRFCにあります。


1
RFC 5789はまだ提案段階にあり、正式に承認されておらず、現在「イラッタが存在する」というフラグが付けられていることに注意することが重要です。この「ベストプラクティス」は非常に議論されており、技術的にはPATCHはまだHTTP標準の一部ではありません。ここでの唯一の真実は、RFCは受け入れられないため、それを行うべきではないということです。
fishpen0

3
それがまだ提案中であるとしても、それが使用されるべきではないという意味ではありません。そうだとしたら、websocketや他の提案されている多くのrfcを使用することはできません...提案を実装することは、他の誰も実装しない完全にカスタムなものを実装することよりも100倍優れています。
ロイック・フォーレ-ラクロワ

BS。これは「提案中」ではなく、HTTP標準の一部です(標準、RFC 7231はメソッドのIANAレジストリに委譲し、PATCHはそこにリストされています)。
Julian Reschke 2016年

@JulianReschkeこのRFCの2行目を読むと、まだPROPOSED STANDARDとしてマークされていることがわかります。そのため、パッチ方式はまだ提案中です。rfcはこちらです。tools.ietf.org/html/rfc5789とrfc7231も提案された標準です。たとえばRFC821を見ると、これはインターネット標準
Lo –c Faure-Lacroix

1
@JulianReschke en.wikipedia.org/wiki/Internet_Standard#Proposed_Standard ...それは私の言葉ではありません。提案された標準は、上で説明したように、それをうまく実装できないという意味ではありません。それが実装するのに十分安定していないという意味ではありません...しかし、それがインターネット標準としてマークされていない限り、まだ提案中です...それについてどのように議論しているかはわかりません。それは「提案された標準」と呼ばれ、それは提案以外に何も意味することができません。提案された標準を使用できると主張したい場合。それはまさに私が書いたものです。
ロイック・フォーレ-ラクロワ

104

私はグーグルで数時間過ごし、ここで答えを見つけました

PUT => ユーザーがレコードのすべてまたは一部のみを更新できる場合は、 PUTを使用します(ユーザーは更新内容を制御します)

PUT /users/123/email
new.email@example.org

PATCH => ユーザーが部分的なレコードのみを更新できる場合、たとえばメールアドレスのみを更新する場合(アプリケーションが更新できるものを制御する)、PATCHを使用します。

PATCH /users/123
[description of changes]

なぜ Patch

PUTメソッドはより多くの帯域幅を必要とするか、部分的にではなくリソース全体を処理します だから、PATCH帯域幅を削減するために導入されました。

パッチについての説明

PATCH 安全ではなく、べき等でもない方法であり、完全および部分的な更新と他のリソースへの副作用を許可します。

PATCH 囲まれたエンティティが、元のサーバーに現在存在するリソースを変更して新しいバージョンを作成する方法を説明する一連の指示を含むメソッドです。

PATCH /users/123
[
  { "op": "replace", "path": "/email", "value": "new.email@example.org" }
]

ここに置くとパッチについての詳細情報


7
なぜこのパッチは安全ではないのですか?
Bishisht Bhatta

1
PATCHAmong POSTPUTなどは「安全」ではありません。データを変更するためです(副作用があります)。比較するとGETOPTIONSあなたが任意の副作用なしのエンドポイントを複数回呼び出すことができます(安全な方法は、など)。
emix 2018

1
PATCHは、帯域幅を節約するためだけに導入されたのではありません。RFC 5789に次のように記載されています。>「相互運用性を向上させ、エラーを防止するには、新しい方法が必要です。」残りのペイロードを含むPUTのみを持つマルチパラレル環境では、リソースの他の属性が変更されるリスクが高まります。PATCHはこのような問題を解決します。
Tomasz Nazar 2018

43

置く
私は私の変更したい場合はfirstその名前を送信プットの更新のための要求を

{ "first": "Nazmul", "last": "hasan" } 

しかし、ここで一つの問題がある持っているput私が送信する場合、その要求putの要求を私はすべての2つのパラメータを送信する必要がありますfirstし、last
再びすべての値を送信するために必須であるので、

パッチ
patchリクエストは言う。送信しdataたいものだけを送信してくださいupdate。他のデータに影響したり変更したりすることはありません。
したがって、すべての値を再度送信する必要はありません。自分の名前を更新したいだけなので、名前だけを送信firstして更新する必要があります。


13

HTTPプロトコルのPOST、PUT、PATCHメソッドの違いは次のとおりです。

役職

HTTP.POSTメソッドは常にサーバー上に新しいリソースを作成します。その非べき等のリクエスト、つまりユーザーが同じリクエストを2回ヒットした場合、制約がない場合、別の新しいリソースが作成されます。

http postメソッドは、常にデータベースに新しいレコードを作成するSQLのINSERTクエリに似ています。

例:バックエンドサーバーが新しいリソースのリソースIDを決定する新しいユーザー、注文などを保存するには、POSTメソッドを使用します。

置く

HTTP.PUTメソッドでは、リソースは最初にURLから識別され、存在する場合は更新され、それ以外の場合は新しいリソースが作成されます。ターゲットリソースが存在する場合、そのリソースは完全に新しい本文で上書きされます。つまり、HTTP.PUTメソッドは、リソースを作成または更新するために使用されます。

http putメソッドは、指定されたレコードが存在するかどうかに応じてレコードを挿入または更新するSQLのMERGEクエリに似ています。

PUT要求はべき等です。つまり、同じ要求を2回押すと、既存の記録が更新されます(新しいレコードは作成されません)。PUTメソッドでは、リソースIDはクライアントによって決定され、リクエストURLで提供されます。

例:PUTメソッドを使用して、既存のユーザーまたは注文を更新します。

パッチ

HTTP.PATCHメソッドは、リソースの部分的な変更、つまりデルタ更新に使用されます。

httpパッチメソッドはSQLのUPDATEクエリに似ており、行全体ではなく、選択した列のみを設定または更新します。

例:PATCHメソッドを使用して注文ステータスを更新できます。

パッチ/ api / users / 40450236 / order / 10234557

リクエストの本文:{status: 'Delivered'}


これは、誰でもputとpatchについて読むことができる最悪の説明です。それに、すでにたくさんの良い答えが投稿された後、あなたの答えはここで違うと思うのはなぜですか?
CodeHunter

3

更新中に、PUT over PATCHには制限があります。PUTを使用するには、1つの属性のみを変更する場合でも、すべての属性を指定する必要があります。ただし、PATCHメソッドを使用する場合は、必要なフィールドのみを更新でき、すべてのフィールドについて言及する必要はありません。PATCHでは、配列の値を変更したり、属性や配列のエントリを削除したりすることはできません。


1

PUTメソッドとPATCHメソッドは本質的に似ていますが、重要な違いがあります。

PUT - PUTリクエストでは、囲まれたエンティティはサーバーに常駐するリソースの変更されたバージョンと見なされ、この変更されたエンティティによって置き換えられます。

PATCH - PATCHリクエストでは、囲まれたエンティティに、サーバーに常駐するエンティティを変更して新しいバージョンを作成する方法を示す一連の命令が含まれています。


1

HTTPの用語によれば、PUTリクエストはデータベースの更新ステートメントのようなものです。 PUT-既存のリソース(以前はPOSTED)を変更するために使用されます。一方、PATCH要求は既存のリソースの一部を更新するために使用されます。

例えば:

お客様情報:

// This is just a example.

firstName = "James";
lastName = "Anderson";
email = "email@domain.com";
phoneNumber = "+92 1234567890";
//..

レコード全体を更新したいときは?Http PUT verbそのために使用する必要があります。

といった:

// Customer Details Updated.

firstName = "James++++";
lastName = "Anderson++++";
email = "email@Updated.com";
phoneNumber = "+92 0987654321";
//..

一方、レコード全体ではなくレコードの一部のみを更新する場合は、に進みHttp PATCH verbます。 といった:

   // Only Customer firstName and lastName is Updated.

    firstName = "Updated FirstName";
    lastName = "Updated LastName";
   //..

PUT VS POST:

PUTリクエストを使用するときは、firstName、lastName、email、phoneNumberなどのすべてのパラメーターを送信するpatch必要があります。一方、リクエストでは、更新するパラメーターのみを送信し、他のデータに影響または変更を加えません。

詳細については、https//fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/をご覧ください。


0

PutとPatchメソッドは似ています。しかし、railsではメソッドが異なります。レコード全体を更新または置換する場合は、Putメソッドを使用する必要があります。特定のレコードを更新する場合は、Patchメソッドを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.