web-dev-qa-db-ja.com

の違いは何ですか POST そしてPUT HTTP REQUEST?

どちらも本体内のサーバーにデータを送信しているようですが、どう違うのですか。

693
fuentesjr

HTTP PUT:

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

PUTのHTTP 1.1 RFCの場所

HTTP POST:

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

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

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

HTTP 1.1のRFC [POST のRFCロケーション

POSTとPUTの違い:

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

POSTとPUTリクエストの基本的な違いは、Request-URIの意味の違いに反映されています。 POST要求内のURIは、囲まれたエンティティを処理するリソースを識別します。そのリソースは、データ受け入れプロセス、他のプロトコルへのゲートウェイ、または注釈を受け入れる別のエンティティなどです。対照的に、PUTリクエストのURIはリクエストに同封されたエンティティを識別します - ユーザエージェントはどんなURIが意図されているか知っていて、サーバはリクエストを他のリソースに適用しようと試みてはいけません。サーバが要求が異なるURIに適用されることを望むなら、それは301(永久に移動された)応答を送らなければなりません。ユーザエージェントはそれからリクエストをリダイレクトするかどうかに関してそれ自身の決定をするかもしれません。

正しい方法を使用しますが、関係ありません:

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

700
Brian R. Bondy

意味だけ。

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

HTTPのPOSTはより一般的です。サーバー上でアクションを開始するはずです。そのアクションは、URIで識別されたリソースに要求本体を格納すること、または異なるURIであること、または異なるアクションであることがあります。

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

174
Jonathan Arkell

RESTスタイルのリソースの例を挙げます。

たくさんの本の情報を含む "POST/books"は新しい本を作成し、その本を識別する新しいURL "/ books/5"で応答するかもしれません。

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

リソース以外のスタイルでは、POSTを副作用のあるものなら何にでも使用できます。もう1つの違いは、PUTは冪等であるべきであるということです - 複数のPOSTが複数のオブジェクトを作成するかもしれない、あるいはあなたのPOSTアクションが何であれ、同じデータに対する同じデータの複数PUTは問題ないはずです。

105
bhollis

PUTは、特定のURIにものを「アップロード」したり、そのURIにすでに含まれているものを上書きしたりするための方法を意味します。

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

HTTP RFCを参照してください

55
Daniel Bruce

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

  1. POST - 文書やその他のリソースを作成する

  2. PUT - 作成した文書またはその他のリソースを更新します。

しかし、そのPUTを明確にするために、既存のレコードがあればそれを「置き換え」、存在しなければ作成します。

38
ChanGan

他の人たちはすでに素晴らしい答えを投稿しています。私はちょうどほとんどの言語、フレームワーク、そしてユースケースでPOSTを扱うことになるでしょう。 PUT、DELETEなどは基本的には簡単な質問です。

16
Jason Morrison
  1. _ get _ :サーバからデータを取得します。他の影響はないはずです。
  2. _ post _ :新しいエンティティを作成するためにデータをサーバーに送信します。ファイルをアップロードするときやWebフォームを送信するときによく使用されます。
  3. _ put _ :POSTに似ていますが、既存のエンティティを置き換えるために使用されます。
  4. _ patch _ :PUTと似ていますが、既存のエンティティ内の特定のフィールドのみを更新するために使用されます。
  5. _ delete _ :サーバーからデータを削除します。
  6. _ trace _ :サーバーが受信した内容をテストする方法を提供します。それは単に送られたものを返します。
  7. _ options _ :サービスでサポートされている要求メソッドに関する情報をクライアントが取得できるようにします。関連する応答ヘッダーは、サポートされているメソッドでは許可です。 CORSでは、実際のリクエスト方法についてサーバーに通知し、カスタムヘッダーについて問い合わせるためのプリフライトリクエストとしても使用されます。
  8. _ head _ :レスポンスヘッダだけを返します。
  9. _ connect _ :ブラウザがプロキシと対話し、最後のURIがhttps://で始まることを知っているときにブラウザによって使用されます。 CONNECTの目的はエンドツーエンドの暗号化されたTLSセッションを可能にすることであり、そのためデータはプロキシから読み取れません。
14
walkerbox

POSTはファクトリタイプのメソッドのようなものと見なされます。あなたはあなたが欲しいものを作り出すためにそれと共にデータを含み、そして反対側にあるものは何でもそれをどうするべきか知っている。 PUTは与えられたURLで既存のデータを更新するため、あるいはURIが何であるかがわかっていてそれがまだ存在していないときに新しいものを作成するために使われます(作成するPOSTとは対照的)何かをして、必要ならURLを返してください。

11
user12786

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

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

RFC 2616の55ページ(「ハイパーテキスト転送プロトコル - HTTP/1.1」)、 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を読んでください。

9
Najeebul Hasan

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

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

•リソースを取得するには、GETを使用してください。

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

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

さらに詳しい情報: RESTful Webサービス:IBMの基本 /

9
Long Nguyen

POSTとPUTの違いは、PUTは冪等であるということです。つまり、同じPUTリクエストを複数回呼び出すと、常に同じ結果が得られます(副作用はありません)。 POST requestは、同じリソースを複数回作成することによる(追加の)副作用が繰り返し発生する可能性があります。

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

POST:リソースを作成するためにデータをサーバーに送信します。要求の本文の種類は、Content-Typeヘッダーによって示されます。それはしばしば状態の変化やサーバーへの副作用を引き起こします

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

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

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

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

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

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

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

1
qaautodev

POSTは一般的な CSRF攻撃 の影響を受けるが、PUTはそうではないことを言及する価値があります。

以下のCSRFは 被害者がattackersite.comを訪問したときにPUTでは不可能です:

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

<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リクエスト(クッキーが送信されます):(PUTはプリフライトリクエストをトリガーします)

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

単に

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

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

この呼び出しは新しい本を作成し、その本を返しますURI

Response ..../books/5

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

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

PUTを使用してリソース識別子を提供しますが、POSTは新しいリソース識別子を返します。

0
Melad Ezzat