目次
- 目次
- HTTPメソッドとは何か?
- CRUDとHTTPメソッドの対応
- POSTとPUTの違いは何?
- HEADとは何?
- POSTでPUT/DELETEを代用してみる
- 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はべき等にすることもできます。 |