POSTとPUT HTTP REQUESTの違いは何ですか?


回答:


893

HTTP PUT:

PUTは、ファイルまたはリソースを特定のURIに、正確にはそのURIに配置します。そのURIに既にファイルまたはリソースがある場合、PUTはそのファイルまたはリソースを置き換えます。そこにファイルまたはリソースがない場合、PUTはそれを作成します。PUTはべきですが、逆説的にPUT応答はキャッシュできません。

PUTのHTTP 1.1 RFCロケーション

HTTP POST:

POSTは特定のURIにデータを送信し、そのURIのリソースがリクエストを処理することを期待します。この時点でのWebサーバーは、指定されたリソースのコンテキストでデータをどう処理するかを決定できます。POSTメソッドはべき等ではありません、サーバーが適切なCache-ControlおよびExpiresヘッダーを設定している限り、POST応答キャッシュ可能です。

公式のHTTP RFCは、POSTを次のように指定しています。

  • 既存のリソースの注釈。
  • 掲示板、ニュースグループ、メーリングリスト、または同様の記事グループにメッセージを投稿する。
  • フォームの送信結果などのデータブロックをデータ処理プロセスに提供する。
  • 追加操作によるデータベースの拡張。

POSTのHTTP 1.1 RFCロケーション

POSTとPUTの違い:

RFC自体がコアの違いを説明しています。

POST要求とPUT要求の基本的な違いは、Request-URIの異なる意味に反映されています。POSTリクエストのURIは、囲まれたエンティティを処理するリソースを識別します。そのリソースは、データを受け入れるプロセス、他のプロトコルへのゲートウェイ、または注釈を受け入れる個別のエンティティである可能性があります。対照的に、PUTリクエストのURIは、リクエストに含まれるエンティティを識別します。ユーザーエージェントは、意図するURIを認識しており、サーバーは他のリソースへのリクエストの適用を試みてはいけません。サーバーが要求を別のURIに適用することを望む場合、サーバーは301(永久に移動)応答を送信する必要があります。次に、ユーザーエージェントは、リクエストをリダイレクトするかどうかについて独自の決定を行うことができます。

さらに、もう少し簡潔に説明すると、RFC 7231のセクション4.3.4 PUTには次のように記載されています(強調が追加されています)。

4.3.4。プット

PUTメソッドは、ターゲットリソースの状態が、要求メッセージのペイロードで囲まれた表現によって定義された状態である createdreplaced、またはその状態で定義されていることを要求します。

適切な方法を使用して、無関係なことはさておき:

REST ROAとSOAPの利点の1つは、HTTP REST ROAを使用するときに、HTTP動詞/メソッドの適切な使用を促進することです。したがって、たとえば、その正確な場所にリソースを作成する場合にのみ、PUTを使用します。また、GETを使用してリソースを作成または変更することは決してありません。


1
私はそのスペックを読みましたIf the Request-URI does not point to an existing resource [...] the origin server *can* create the resource with that URI。したがって、存在しない場合にリソースの作成を拒否するPUTの実装は正しいでしょう。もしそうなら、これは実際に起こりますか?または、実装は通常PUTでも作成されますか?
houcros 2017年

1
違いを明確にするいくつかの追加の例外は、次のURLにあります-dzone.com/articles/put-vs-post
Ashish Shetkar

1
私が理解していないのは、PUTのべき等を実装する方法です。一般に、新しいリソースを作成する場合、ほとんどのAPIはIDの自動生成を使用します。PUTでは、リソースが存在しない場合は作成する必要がありますが、URIで指定されたIDを使用しますが、ID生成メソッドが自動に設定されている場合はどうすればよいですか?
Roni Axelrad

1
つまり、POSTリクエストのURIは、囲まれたエンティティを処理するリソースを識別しますPUTリクエストのURI はエンティティ自体を識別します
Drazen Bjelovuk

POSTメソッドへの応答はキャッシュできません。応答に適切なCache-ControlまたはExpiresヘッダーフィールドが含まれていない限り
NattyC

211

セマンティクスのみ。

HTTP PUTは要求の本文を受け入れ、URIで識別されるリソースにそれを格納することになっています。

HTTP POSTはより一般的です。サーバーでアクションを開始することになっています。そのアクションは、URIで識別されたリソースにリクエスト本文を格納することである場合もあれば、別のURIである場合もあれば、別のアクションである場合もあります。

PUTはファイルのアップロードにています。URIへの書き込みは、そのURIに正確に影響します。URIへのPOSTは、まったく影響を与えません。


特定の機能を暗示するものは実際にはないかもしれません
TaylorMac

131

RESTスタイルのリソースの例を示すには:

大量の書籍情報を含む「POST / books」は、新しい書籍を作成し、その書籍を識別する新しいURL「/ books / 5」で応答する場合があります。

"PUT / books / 5"は、IDが5の新しい本を作成するか、既存の本をID 5で置き換える必要があります。

非リソーススタイルでは、POSTは副作用のあるほぼすべてのものに使用できます。もう1つの違いは、PUTはべき等である必要があるということです。同じデータの同じURLへの複数のPUTは問題ないはずです。


こんにちはBhollis、POST / books / 5を使用するとどうなりますか?見つからないリソースをスローしますか?
ChanGan 2013

13
べき等性はPUTとPOSTの最も際立った重要な違いだと思います
Martin Andersson

1
こんにちはChanGanさん、ここでWikipediaが「POST / books / 5」のケースについて説明するのは次のとおりです。
rdiachenko 2013年

この答えは、PUTとPOSTを同じリソースで定義できるという印象を与えますが、べき等の隣のもう1つの違いは、IDスペースを制御するユーザーです。PUTでは、ユーザーは特定のIDを持つリソースを作成することでIDスペースを制御しています。POSTでは、サーバーはユーザーがGETなどの後続の呼び出しで参照する必要があるIDを返します。上記は両方が混在しているため、奇妙です。
トミー

74
  1. GET:サーバーからデータを取得します。他の影響はないはずです。
  2. POST:新しいエンティティを作成するためにサーバーにデータを送信します。ファイルのアップロードやWebフォームの送信時によく使用されます。
  3. PUT:POSTに似ていますが、既存のエンティティを置き換えるために使用されます。
  4. PATCH:PUTに似ていますが、既存のエンティティ内の特定のフィールドのみを更新するために使用されます。
  5. DELETE:サーバーからデータを削除します。
  6. TRACE:サーバーが受信するものをテストする方法を提供します。送信されたものを返すだけです。
  7. オプション:クライアントがサービスでサポートされているリクエストメソッドに関する情報を取得できるようにします。関連する応答ヘッダーは、サポートされているメソッドでの許可です。CORSでプリフライトリクエストとしても使用され、実際のリクエストメソッドについてサーバーに通知し、カスタムヘッダーについて尋ねます。
  8. HEAD:応答ヘッダーのみを返します。
  9. CONNECT:プロキシと通信し、最終的なURIがhttps://で始まることがわかっている場合に、ブラウザによって使用されます。CONNECTの目的は、エンドツーエンドの暗号化されたTLSセッションを許可することです。そのため、プロキシからデータを読み取ることができません。

9
ベストショートアンサー
vibs2006

httpsを使用する場合、CONNECTは各リクエストの前に発生しますか?
変数

66

PUTは、特定のURIにデータを「アップロード」する方法、またはそのURIに既にあるものを上書きする方法として意図されています。

一方、POSTは、RELATEDデータを特定のURIに送信する方法です。

HTTP RFCを参照しください


45

私の知る限り、PUTは主にレコードの更新に使用されます。

  1. POST-ドキュメントまたはその他のリソースを作成するには

  2. PUT-作成されたドキュメントまたはその他のリソースを更新します。

しかし、そのPUTを明確にするために、通常、既存のレコードが存在する場合は「置き換え」、存在しない場合は作成します。


1
このコンテキストでのレコードとは何ですか?問題はHTTPリクエストについてです。
Kishore 2015

ドキュメント/リソースがすでに存在する場合、POSTは何をしますか?エラーをスローしますか、それとも問題ありませんか?
Aditya Pednekar、

私が読んだほとんどの内容に基づいて、PUTも作成できます。
aderchox

19

他のユーザーはすでに優れた回答を投稿しています。ほとんどの言語、フレームワーク、およびPUTよりもはるかに頻繁にPOSTを処理するユースケースでそれを追加したかっただけです。PUT、DELETEなどが基本的に雑学クイズになるところまで。


15

ご覧ください:http : //zacharyvoase.com/2009/07/03/http-post-put-diff/

私は最近、POSTを使用してリソースを作成し、PUTを使用してリソースを更新/変更するという、Web開発者による一般的な誤解にかなり悩まされています。

RFC 2616(「ハイパーテキスト転送プロトコル-HTTP / 1.1」)のセクション 55、セクション9.6(「PUT」)を見ると、PUTの実際の目的がわかります。

PUTメソッドは、囲まれたエンティティが指定されたRequest-URIに格納されることを要求します。

POSTとPUTの違いを説明する便利な段落もあります。

POST要求とPUT要求の基本的な違いは、Request-URIの異なる意味に反映されています。POSTリクエストのURIは、囲まれたエンティティを処理するリソースを識別します。そのリソースは、データ受け入れプロセス、他のプロトコルへのゲートウェイ、または注釈を受け入れる個別のエンティティである可能性があります。対照的に、PUTリクエストのURIは、リクエストで囲まれたエンティティを識別します。ユーザーエージェントは意図されているURIを認識しており、サーバーはリクエストを他のリソースに適用してはなりません。

更新と作成の違いについては何も触れられていません。それはこれの間の違いについてです:

obj.set_attribute(value) # A POST request.

この:

obj.attribute = value # A PUT request.

だから、この人気の誤解の広がりを止めてください。RFCを読んでください。


13
これは無意味に失礼であり、あまり役に立たない方法で見苦しいようです。引用するPUTの例では、新しいエンティティはRESTful APIでは「新しい」レコードであり、その場所でアクセスできます。そのようにサブメンバーを変更可能にするのが適切な設計上の選択であるかどうかは疑問です(それは理想的ではないと思います)が、それでも、亜種を使用して多くの有用な情報を攻撃しています。ほとんどの場合、通常述べられているような説明は、要約されたRFCの内容と、通常および慣習の両方についてのすばらしい記述です。また、礼儀正しさを損なうこともありません。
tooluser 2015

3
これは十分に賛成できない。PUTはREST APIには場所がありません。ほとんどの場合、POSTは正しいセマンティクスを示します。
ビーフスター

よく言われていませんが、実際にはRFCの正確な解釈です。Web開発者の世界は、かなり間違った情報の山だと思われます。
ウィリアムTフログガード

@Beefster「POSTが示す」というようなものはありません。ナジーブルはここで大きなポイントを作りました。それが示す内容をどのように理解しますか?初日からずっとそのように使っていたので、それを使うだけで、他の人と比べてなぜそれを使うべきなのか本当にわからないのを除いて。
Mosia Thabo

12

POSTは、ファクトリタイプのメソッドと見なされます。あなたはそれを使ってあなたが望むものを作成するためにデータを含めます、そしてもう一方の端にあるものはそれをどうするかを知っています。PUTは、指定されたURLで既存のデータを更新するため、またはURIがどうなるかがわかっていて、まだ存在しない場合に何か新しいものを作成するために使用されます(何かを作成してURLを返すPOSTとは対照的)必要に応じて)。


10

RESTは、HTTPメソッドを明示的に、プロトコルの定義と整合性のある方法で使用するよう開発者に求めます。この基本的なREST設計原則は、作成、読み取り、更新、削除(CRUD)操作とHTTPメソッドの間の1対1のマッピングを確立します。このマッピングによると:

•サーバーにリソースを作成するには、POSTを使用します。

•リソースを取得するには、GETを使用します。

•リソースの状態を変更または更新するには、PUTを使用します。

•リソースを削除または削除するには、DELETEを使用します。

詳細: RESTful Webサービス:IBMの基本


私はあなたがPUTとPOSTを逆にしていると思います
Beefster

@Beefster Postで作成し、更新しますか?
Long Nguyen

いいえ。PUTは実際にリテラルコンテンツをURLに配置するためのものであり、REST APIに配置されることはほとんどありません。POSTはより抽象的で、「この正確なファイルをこの正確なURLに配置する」というセマンティクスを持たない、あらゆる種類の追加コンテンツをカバーしています。
ビーフスター

7

どちらを使用するかは非常に簡単なはずですが、複雑な表現は多くの人にとって混乱の元になります。

それらをいつ使用するか:

  • PUTすでにリソースコレクションの一部である単一のリソースを変更する場合に使用します。PUTリソース全体を置き換えます。例:PUT /resources/:resourceId

    補足:PATCHリソースの一部を更新する場合に使用します。


  • POSTリソースのコレクションの下に子リソースを追加する場合に使用します。
    例:POST => /resources

一般に:

  • 通常、実際には、常にUPDATE操作に使用PUTします。
  • 常にCREATE操作に使用POSTします。

例:

GET / company / reports => すべてのレポートを取得
GET / company / reports / {id} => 「id」で識別されるレポート情報を取得
POST / company / reports => 新しいレポートを作成
PUT / company / reports / {id} => 更新「id」で識別されるレポート情報
PATCH / company / reports / {id} => 「id」で識別されるレポート情報の一部を更新
DELETE / company / reports / {id} => 「id」でレポートを削除


4

POSTとPUTの違いは、PUTがべき等であることです。つまり、同じPUT要求を複数回呼び出すと、常に同じ結果が得られます(つまり、副作用はありません)。一方、POST要求を繰り返し呼び出すと、(追加)同じリソースを複数回作成することの副作用。

GET :GETを使用したリクエストはデータのみを取得します。つまり、指定されたリソースの表現をリクエストします

POST:サーバーにデータを送信してリソースを作成します。リクエストの本文のタイプは、Content-Typeヘッダーで示されます。多くの場合、サーバーに状態の変化や副作用が発生します

PUT :新しいリソースを作成するか、ターゲットリソースの表現をリクエストペイロードで置き換えます

PATCH :リソースに部分的な変更を適用するために使用されます

DELETE :指定されたリソースを削除します

TRACE :ターゲットリソースへのパスに沿ってメッセージループバックテストを実行し、有用なデバッグメカニズムを提供します

OPTIONS :ターゲットリソースの通信オプションを説明するために使用されます。クライアントは、OPTIONSメソッドのURL、またはサーバー全体を参照するアスタリスク(*)を指定できます。

HEAD :GETリクエストと同じレスポンスを要求しますが、レスポンスボディはありません

CONNECT :ターゲットリソースによって識別されるサーバーへのトンネルを確立し、SSL(HTTPS)を使用するWebサイトへのアクセスに使用できます


2

RESTフル使用

POST 新しいリソースを作成するために使用され、リソースを返します URI

EX 
      REQUEST : POST ..../books
        {
        "book":"booName",
        "author":"authorName"
        }

この呼び出しは新しい本を作成し、その本を返す場合があります URI

Response ...THE-NEW-RESOURCE-URI/books/5

PUT リソースを置き換えるために使用されます。そのリソースが存在する場合は単に更新しますが、そのリソースが存在しない場合は作成します。

REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}

ではPUT、私たちのリソース識別子を知っているが、POST新しいリソース識別子を返します。

REST以外の使用法

POST サーバー側でアクションを開始するために使用されます。このアクションはリソースを作成する場合と作成しない場合がありますが、このアクションは常に影響を及ぼし、サーバー上の何かを変更します

PUT 特定のURLでリテラルコンテンツを配置または置換するために使用されます

RESTフルスタイルと非RESTフルスタイルの別の違い

POST 非べき等操作です。同じリクエストで複数回実行すると、一部の変更が発生します。

PUT べき等演算です。同じリクエストで複数回実行しても、副作用はありません。


1

それは言及する価値になりPOST、いくつかの共通の対象となるクロスサイトリクエストフォージェリ(CSRF)攻撃ながらPUTではありません。

以下のCSRFは、被害者が訪問したPUT場合には不可能attackersite.comです。

攻撃の効果があることである被害者が意図せずにユーザーを削除して(被害者)がログインしてたからといってadmintarget.site.com、お出かけになる前にattackersite.com

通常のリクエスト(Cookieが送信されます):(PUTはサポートされている属性値ではありません)

上のコードattackersite.com

<form id="myform" method="post" action="http://target.site.com/deleteUser" >
    <input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>

XHRリクエスト(Cookieが送信されます):(PUTプリフライトリクエストがトリガーされ、そのレスポンスによりブラウザーがdeleteUserページをリクエストできなくなります)

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);

1

簡単な言葉で言うと:

1.HTTP Get:1つ以上のアイテムを取得するために使用されます

2.HTTPポスト:アイテムの作成に使用されます

3.HTTP Put:アイテムの更新に使用されます

4.HTTPパッチ:アイテムを部分的に更新するために使用されます

5.HTTP削除:アイテムを削除するために使用されます


0

実は彼らの肩書き以外に違いはありません。実際、GETと他の基本的な違いがあります。「GET」リクエストメソッドを使用すると、最初に疑問符で区切られ、次に&記号で区切られたurl-address-lineでデータを送信します。

ただし、「POST」リクエストメソッドでは、URLを介してデータを渡すことはできませんが、データをリクエストのいわゆる「本体」でオブジェクトとして渡す必要があります。サーバー側では、送信されたデータを取得するために、受信したコンテンツの本文を読み取る必要があります。しかし、反対に、「GET」リクエストを送信するときに、本文のコンテンツを送信する可能性はありません。

「GET」はデータを取得するためだけであり、「POST」はデータを投稿するためのものであるという主張は完全に間違っています。「GET」リクエストまたは「POST」リクエストによって送信されたデータに基づいて、新しいコンテンツの作成、既存のコンテンツの削除、既存のコンテンツの編集、またはバックエンドでのあらゆる操作を阻止することはできません。そして、「POST」リクエストを使用してクライアントがデータを要求するような方法でバックエンドをコーディングすることを妨げることはできません。

リクエストでは、使用するメソッドに関係なく、URLを呼び出して、指定するデータを送信するか送信せず、リクエストに対処するためにサーバーに渡す情報を送信します。その後、クライアントはサーバー。データには、送信したいものを何でも含めることができ、バックエンドはデータを使用して何でも実行でき、応答には、そこに入れたい情報を含めることができます。

これらの2つの基本的な方法しかありません。GETおよびPOST。しかし、それはそれらの構造であり、バックエンドでコーディングするものとは異なります。バックエンドでは、受信したデータを使用して、好きなようにコーディングできます。ただし、「POST」リクエストでは、url-addresslineではなく、本文でデータを送信/取得する必要があります。また、「GET」リクエストでは、url-addresslineではなく、url-addresslineでデータを送信/取得する必要があります。体。それで全部です。

「PUT」、「DELETE」などの他のすべてのメソッドは、「POST」と同じ構造です。

コンテンツを多少非表示にしたい場合は、POSTメソッドが主に使用されます。これは、url-addresslineに書き込んだものは何でもキャッシュに保存され、GET-Methodはデータでurl-addresslineを書き込むのと同じであるためです。したがって、必ずしもユーザー名とパスワードであるとは限らない機密データを送信する場合は、たとえば、url-address-lineに表示したくない一部のIDまたはハッシュを送信する場合は、POSTメソッドを使用する必要があります。 。

また、URL-Addresslineの長さは1024記号に制限されていますが、「POST」メソッドは制限されていません。そのため、大量のデータがある場合、GET-Requestでデータを送信できない可能性がありますが、POST-Requestを使用する必要があります。したがって、これはPOSTリクエストのもう1つのプラスポイントでもあります。

ただし、複雑なテキストを送信する必要がない場合は、GET要求を処理する方がはるかに簡単です。それ以外の場合、これはPOSTメソッドのもう1つの利点です。つまり、GETメソッドでは、テキスト内のいくつかの記号やスペースを送信できるようにするために、テキストをURLエンコードする必要があります。ただし、POSTメソッドを使用すると、制限がなくなり、コンテンツを変更したり操作したりする必要がありません。


0

PUTとPOSTはどちらもRestメソッドです。

PUT-同じパラメーターを使用するPUTを使用して同じ要求を2回行う場合、2番目の要求は効果がありません。これが、PUTが一般的に更新シナリオで使用される理由です。同じパラメーターでUpdateを複数回呼び出しても、最初の呼び出し以外は何も実行されないため、PUTはべき等です。

POSTはべき等ではありません。たとえば、Createはターゲットに2つの個別のエントリを作成するため、べき等ではないため、CREATEはPOSTで広く使用されます。

毎回同じパラメーターでPOSTを使用して同じ呼び出しを行うと、2つの異なることが発生するため、作成シナリオでPOSTが一般的に使用される理由

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