[解決済み】HTTPのPOSTとPUTの違いは何ですか?
質問
によると
rfc 2616, § 9.5
,
POST
が使われているのは
作成
リソースを作成します。
POSTメソッドは、リクエストに含まれるエンティティを、Request-LineのRequest-URIで特定されるリソースの新しい下位としてオリジンサーバーに受け入れるよう要求するために使用されます。
によると
rfc 2616, § 9.6
,
PUT
が使われているのは
作成または置換
リソースを指定します。
PUTメソッドは、指定されたRequest-URIの下に同封のエンティティを格納するよう要求します。Request-URIが既に存在するリソースを参照する場合、同封のエンティティは、オリジン サーバーに存在するものの修正版とみなされるべきである[SHOULD]。Request-URIが既存のリソースを指しておらず、そのURIがリクエストする ユーザーエージェントによって新しいリソースとして定義できる場合、オリジン サーバーはそのURIを持つリソースを生成できる。
では、リソースの作成にはどちらのHTTPメソッドを使用すればよいのでしょうか?それとも両方がサポートされるべきなのでしょうか?
解決方法は?
全体的に。
作成にはPUTとPOSTの両方が使用可能です。
何を使うべきかを見分けるには、「何に対してアクションを行うのか?例えば、質問をするためのAPIを設計しているとしましょう。 もしPOSTを使いたいのであれば、質問のリストに対してそれを行うでしょう。PUTを使いたいのであれば、特定の質問に対して行うでしょう。
では、RESTfulデザインではどちらを使えばいいのでしょうか。
PUTとPOSTの両方に対応する必要はありません。
どちらを使うかはあなた次第です。 しかし、リクエストの中でどのオブジェクトを参照するかによって、正しい方を使うことだけは忘れないでください。
いくつか考慮すべき点があります。
- 作成したURLオブジェクトに明示的に名前を付けるのか、それともサーバーに判断させるのか?もし名前を付けるのであれば、PUTを使用します。 サーバーが決定する場合は、POSTを使用します。
- PUTはidempotencyを仮定して定義されているので、オブジェクトを2回PUTしても、それ以上の効果はないはずです。 これは素晴らしい特性なので、私は可能な限りPUTを使用します。ただ、PUT-idempotencyが実際にサーバーで正しく実装されていることを確認してください。
- 同じオブジェクトのURLで、PUTでリソースを更新または作成することができます。
- POST では、URL を変更する 2 つのリクエストを同時に受信することができ、それらはオブジェクトの異なる部分を更新することができます。
一例です。
の一部として、次のように書きました。 この件に関してはSOの別の回答 :
POSTです。
リソースの変更・更新に使用します
POST /questions/<existing_question> HTTP/1.1 Host: www.example.com/
なお、以下はエラーになります。
POST /questions/<new_question> HTTP/1.1 Host: www.example.com/
URLがまだ作成されていない場合は は、POSTで作成してはいけません。 を指定しながら これは リソースが見つかりません」というエラーが発生します。 というのも
<new_question>
は存在しません。 はまだです。 をPUTする必要があります。<new_question>
リソースをサーバーにインストールします。しかし、次のようにすることもできます。 を使用して、POSTでリソースを作成します。
POST /questions HTTP/1.1 Host: www.example.com/
この場合、リソース の名前を指定しない場合、新しいオブジェクトの のURLパスが返されます。
PUTしてください。
リソースを作成するために使用します。 を上書きする。 を指定する一方で リソースの新しい URL を指定します。
新しいリソースの場合。
PUT /questions/<new_question> HTTP/1.1 Host: www.example.com/
既存のリソースを上書きする場合。
PUT /questions/<existing_question> HTTP/1.1 Host: www.example.com/
さらに、もうちょっと簡潔に。 RFC 7231 第 4.3.4 項 PUT と記載されています(強調)。
4.3.4. PUT
PUT メソッドは、対象リソースの状態を要求する。
created
またはreplaced
という表現で定義された状態 をリクエストメッセージペイロードで囲む。
関連
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] URI、URL、URNの違いは何ですか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み] リソースが既に存在する場合の POST に対する HTTP レスポンスコード
-
[解決済み] POSTとPUT HTTP REQUESTの違いは何ですか?
-
[解決済み] RESTリソースの命名規則はSingularとPluralのどちらを使用すべきですか?
-
[解決済み】REST APIでのPUTメソッドとPATCHメソッドの使い分け 実生活でのシナリオ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] IISファイルのダウンロードがハングアップ/タイムアウトする - sc-win32-status = 64
-
youtubeマッチチャンネル(チャンネル)
-
[解決済み] 404ヘッダー - HTTP 1.0か1.1か?
-
[解決済み] HTTP DELETE リクエストにエンティティボディは許されますか?
-
[解決済み] サブドメインとドメイン間でCookieを共有する
-
[解決済み】AngularでHTTPリクエストにURL引数(クエリ文字列)を渡すには?
-
[解決済み】GETリクエストで同じパラメータ名で複数の値を渡す場合の正しい方法
-
[解決済み】ダイジェスト認証とベーシック認証の違いは何ですか?
-
[解決済み】CURL コマンドライン URL パラメータ
-
[解決済み] ログインページにリダイレクトする際の正しいHTTPステータスコードは何ですか?