RailsアプリケーションでPUT
リクエストを使用しています。現在、新しいHTTP動詞PATCH
がブラウザーに実装されています。したがって、PATCH
リクエストとPUT
リクエストの主な違いと、どちらを使用すべきかを知りたいと思います。
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リソースを論理的に変更できるかどうか) )および権限など.
PUTリクエストとPATCHリクエストの違いは、サーバーが囲まれたエンティティを処理して変更する方法に反映されますRequest-URIで識別されるリソース。 PUTリクエストでは、囲まれたエンティティはOriginサーバーに保存されたリソースの修正バージョンと見なされ、クライアントは保存されたバージョンの置き換えを要求しています。 PATCHを使用すると、囲まれたエンティティには、Originサーバーに現在存在するリソースをどのように変更するかを説明する一連の指示が含まれます新しいバージョンを生成します。PATCHメソッドは、Request-URIまた、はが他のリソースに副作用を及ぼす可能性があります。つまり、PATCHを適用することにより、新しいリソースを作成したり、既存のリソースを変更したりできます。
私の知る限り、PATCHverbはRails applications ...のように使用されていません...私が理解しているように、RFC patch verb 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にあります。
Googleで数時間を過ごして、答えを見つけました here
PUT=>ユーザーがレコードのすべてまたは一部のみを更新できる場合、PUTを使用します(ユーザーは更新内容を制御します)
PUT /users/123/email
[email protected]
PATCH=>ユーザーが部分レコードのみを更新できる場合、電子メールアドレス(アプリケーションが更新できるものを制御する)だけを言うには、PATCHを使用します。
PATCH /users/123
[description of changes]
なぜPatch
PUT
メソッドはより多くの帯域幅を必要とするか、パーシャルではなくフルリソースを処理します。そのため、帯域幅を削減するためにPATCH
が導入されました。
PATCHについての説明
PATCH
は、安全でもi等でもないメソッドであり、他のリソースに対する完全および部分的な更新と副作用を許可します。
PATCH
は、新しいバージョンを生成するために、Originサーバーに現在存在するリソースをどのように変更する必要があるかを説明する一連の指示を含むエンティティです。
PATCH /users/123
[
{ "op": "replace", "path": "/email", "value": "[email protected]" }
]
ここ putおよびpatchの詳細
プット
myfirst
name__の名前を変更する場合は、put Updateのリクエストを送信します
{ "first": "Nazmul", "last": "hasan" }
しかし、ここに1つの問題がありますput
name__リクエストは、put
name__リクエストを送信したいときに、first
name__とlast
name__である2つのパラメータをすべて送信する必要があるということです
したがって、すべての値を再度送信することが必須です
パッチ:patch
name__リクエストは言う。 data
name__に送信するupdate
name__のみを送信すると、他のデータに影響を与えたり変更したりしません。
したがって、すべての値を再度送信する必要はありません。名前を更新したいので、更新するにはfirst
nameのみを送信する必要があります。
更新中は、パッチよりもPUTに制限があります。 PUTを使用するには、1つの属性のみを変更する場合でも、すべての属性を指定する必要があります。しかし、PATCHメソッドを使用する場合、必要なフィールドのみを更新でき、すべてのフィールドに言及する必要はありません。 PATCHでは、配列の値を変更したり、属性や配列のエントリを削除したりすることはできません。
PUTおよびPATCHメソッドは本質的に似ていますが、重要な違いがあります。
PUT-in PUTリクエストでは、囲まれたエンティティは、サーバー上にあるリソースの変更バージョンと見なされ、この変更されたエンティティに置き換えられます。
PATCH-in PATCHリクエスト、囲まれたエンティティには、サーバーに存在するエンティティを変更して新しいバージョンを生成する指示のセットが含まれています。
HTTPプロトコルのPOST、PUT、およびPATCHメソッドの違いを次に示します。
投稿
HTTP.POSTメソッドは、常にサーバー上に新しいリソースを作成します。それは非べき等の要求です。つまり、ユーザーが同じ要求を2回ヒットすると、制約がない場合は別の新しいリソースが作成されます。
http postメソッドは、常にデータベースに新しいレコードを作成するSQLのINSERTクエリに似ています。
例:POSTメソッドを使用して、バックエンドサーバーが新しいリソースのリソースIDを決定する新しいユーザー、注文などを保存します。
PUT
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メソッドは似ています。しかし、Railsには異なる方法があります。レコード全体を更新/置換する場合は、Putメソッドを使用する必要があります。特定のレコードを更新する場合は、Patchメソッドを使用します。