HTTP PUTは、定義( rfc から引用)に従って、特定のURIに何かを格納するべき等の要求であることを知っています
The PUT method requests that the enclosed entity be stored under the supplied Request-URI.
しかし、「囲まれたエンティティ」の定義は何ですか?フォームデータ(HTTP POST request)など)を送信することはできないようです。JSON/ XMLまたは他のシリアル化形式でエンティティの表現を送信するのはどうですか?
つまり、特定のURIの情報を保存/更新するために、HTTP PUTリクエストをどのように送信するのでしょうか。
囲まれたエンティティは、HTTPメッセージ本文に含まれるペイロードデータです(転送エンコーディングが削除された後)。メッセージ本文の送信に問題がある場合は、Content-Lengthヘッダーを含めるのを忘れている可能性があります-これは、HTTPメッセージに本文があることを示す2つの方法のうちの1つです。
PUTは、POSTと同じですが、このセマンティックの違いは異なります。POSTの場合、URIは、サーブレットなどのエンティティを処理するリソースを識別します。PUTの場合URIはエンティティ自体を識別します。たとえば、エンティティ本体のコンテンツで作成/置換されるファイルなどです。
RESTでは、
GET - retrieve resource
POST - create new resource
PUT - update existing resource
DELETE - delete resource
したがって、PUT動詞はサーバー上の既存のリソースを更新するために使用されます。クライアントに応じて、PUT要求を送信するさまざまな方法があります。たとえば、jquery AJAXの場合:
$.ajax({
type: 'PUT',
url: '/products/123',
data: { name: 'new product name' }
});
そのため、HTTP PUTリクエストは、特定のURIに現在格納されているリソースを置き換えるために発行されることがよくあります。たとえば、本は https://example.org/book/1 に保存されており、データは次のようにJSONで表すことができます。
$ curl --request GET https://example.org/book/1
{
"title": "Stackoverflow Compilation Book 1",
"year": 2019
}
架空の本が昨年(2018)に発行されたため、誰かがyear
フィールドを修正したいとします。その人は、HTTP PUTリクエストを通じて完全に更新された本の情報を送信する必要があります。
$ curl --request PUT
--header "Content-Type: application/json"
--data '{"title": "Stackoverflow Compilation Book 1", "year": 2018}'
year
属性の変更に注意してください。
HTTP PUTリクエストは本質的に置換操作であると考えると、URIで表される本を別のものに置き換えることもできます。例えば、
$ curl --request PUT
--header "Content-Type: application/json"
--data '{"title": "Some random book that nobody publishes", "year": 2019}'
添付データは任意の形式にすることができます(通常、リクエストヘッダーContent-Type
、上記のとおり)、サポートされている限り、通常Accept
応答ヘッダー(アプリケーションが処理するデータタイプの種類を示す)によって報告されます。提出されたデータが有効かどうかを判断するために、アプリケーションコードによってさらに検証が行われます。
ボディがリクエストされたURLに保存したい「囲まれたエンティティ」であるHTTP PUTを送信します。 POSTと非常によく似ていますが、RFCで指定されているセマンティクスのみが異なります。
Request-URIが既存のリソースを参照している場合、囲まれたエンティティは、オリジンサーバーに存在するエンティティの変更バージョンと見なされるべきです(SHOULD)。 Request-URIが既存のリソースを指さず、そのURIが要求元のユーザーエージェントによって新しいリソースとして定義できる場合、オリジンサーバーはそのURIでリソースを作成できます。