Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【Webを支える技術】第3部 7章 HTTPメソッドについてざっくりまとめてみた

目次

HTTPメソッドとは何か?

HTTPメソッドとは、リソースに対して行いたい処理を表すメソッドです。 HTTPメソッドとリソースは、動詞と名詞の関係になっています。

CRUDとHTTPメソッドの対応

CRUDとは、Create・Read・Update・Deleteの4つの基本的なデータ操作のことです。

CRUD 意味 HTTPメソッド
Create 作成 POST/PUT
Read 読み込み GET
Update 更新 PUT/PATCH
Delete 削除 DELETE

POSTとPUTの違いは何?

POST

POSTの役割 意味
子リソースの作成 あるリソースの配下にリソース(子リソース)を作成します。レスポンスのLocationヘッダに新しいリソース(子リソース)のURIが入っています。 例えば、コメントを作成したい場合、/boards/22/commentsに対してPOSTリクエストを出すと、/boards/22/comments/1のように、Web上にリソースが作成されます。このリソースは、/boards/22/commentsというリソースの子リソースです。子リソースを作っているので、ステータスコードは201、テキストフレーズはCreatedになります。このPOSTは存在するURIへのリクエストです。
リソースへのデータの追加 既存リソースに対して、データを追加します。データを追加するだけなので、ステータスコードは200、テキストフレーズはOKになります。
他のメソッドでは対応できない処理 GETメソッドでリクエストを出すと、ボディにデータを入れられません。そのため、クエリストリングを使います。しかし、クエリストリングに指定した文字列がめちゃめちゃ長い場合、POSTリクエストのボディにデータを入れた方が良いです。

PUT

PUTの役割 意味
リソースの更新 既存のリソースの全てのデータを、新しいデータで更新します。
リソースの作成 全く新しいリソースを作成します。このPUTは存在しないURIヘのリクエストです。

POSTは、リソース(子リソース)を作成するときに主に使います。PUTはリソースを更新するときに使います。しかし、リソースの全てのデータを更新するので、リソースを部分的に更新したいならPATCHを使います。PUTを使ってリソースを作成することもできますが、クライアント側で全く新しいURIを指定してリソースを作成するので、リソースが既に存在する場合に上書きしてしまいます。POSTでリソースを作成すると、サーバ側がリソースのURIを自動で作成するので、リソースのURIは重複しません。

Tips

リソースの一部分を更新したい場合、PATCHメソッドでリクエストを発行します。

HEADとは何?

HEADはリソースのヘッダ(メタデータ)だけを取得するメソッドです。GETメソッドのヘッダだけ取得するバージョンです。HEADを使ったリクエストではリソースのヘッダのみを取得するので、リクエストにボディは含まれません。

POSTでPUT/DELETEを代用してみる

HTMLのフォームではGETとPOSTしか使えません。そのため、フォームでGETとPOST以外を送りたい場合、フォームの隠しパラメータ(hidden)に_methodパラメータを用意して、そこにHTTPメソッドを指定します。

aタグなどのリンクは、クリックすると、指定したリソースに対してGETリクエストが発行されます。しかし、Railsの場合、rails-ujsというライブラリをインストールしたおかげで、aタグで作ったリンクを、JavaScriptを使ってDELETEリクエストを隠しパラメータに持つPOSTリクエストのフォームに書き換えています。Reactを使ってボタン等を作っている場合、onClickイベントにDELETEリクエストを送るような関数を指定する必要があります。この場合、関数内でaxiosを用いているなら、リクエストはAjaxリクエストです。結局ブラウザはフォームの場合ではGETメソッド・POSTメソッドを使ったリクエストしか送ることができません。しかし、フォームに隠しフィールドを設定することで、サーバ側でDELETEやPATCHとして判定させるようなリクエストを出すことができます。モダンブラウザのAjaxリクエストの実装では、DELETEやPUT等が実装されているそうです。

HTTPメソッドのべき等性と安全性について

Tips

  • べき等性とは、「同じリクエストを何度繰り返しても、リソースが同じ状態になること」です。また、「ある操作を何回行っても結果が同じこと(結果が重要であって、過程は関係ない)」を意味します。
  • 安全性とは、「操作対象のリソースの状態を変化させないこと」です。
  • 安全ではないということは、リソースの状態が変化していることを表す。
  • HTTPメソッドにおける副作用とは、「リソースの状態に変化を与えること」です。
メソッド 性質 備考
GET、HEAD べき等かつ安全
PUT、DELETE べき等だが安全でない 同じリクエストを送っても、同じ結果になるのでべき等です。
POST、PATCH べき等でも安全でもない postは同じリクエストを何度も送ると、リクエストした分だけ別の新しいリソースを作成してしまい、前回と同じ結果になりません。patchはべき等にすることもできます。

参考記事

PATCH - HTTP | MDN

Rails学習者にrails-ujsの動作説明したら感動された話 - INODEVLOG

http — PUT、DELETE、HEADなどのメソッドは、ほとんどのWebブラウザで利用できますか?