曖昧だったHTTPメソッド(CRUD)についてまとめた。
HTTPメソッドの種類は8つ
HTTPメソッドは、クライアントが行いたい処理をサーバに伝えるという役割があるが
メソッドはたったの8つだけ。しかもメインで使うのは5つか6つ!
メソッド | 意味 |
---|---|
GET | リソースの取得 |
POST | 子リソースの作成、リソースへのデータ追加、その他処理 |
PUT | リソースの更新、リソースの作成 |
DELETE | リソースの削除 |
HEAD | リソースのヘッダ (メタデータの取得) |
OPTIONS | リソースがサポートしているメソッドの取得 |
TRACE | プロキシ動作の確認 |
CONNECT | プロキシ動作のトンネル接続への変更 |
#CRUD
CRUDはCreate, Read, Update, Deleteのこと。
HTTPメソッドのうちGET、POST、PUT、DELETEは「CRUD」を満たす
CURD名 | 意味 | メソッド |
---|---|---|
Create | 作成 | POST/PUT |
Read | 読み込み | GET |
Update | 更新 | PUT |
Delete | 削除 | DELETE |
というわけで、CRUDを満たす4つのメソッドについてまとめてみたよー
#1. GET -> リソースの取得
指定したURIの情報を取得するメソッド。
利用頻度はおそらく最も高く、Webページ、画像、映像、フィードの取得などがこれに当たる。
GET /list HTTP/1.1
Host: example.jp
HTTP/1.1 200 OK
Content-Type: application/json
[
{"uri": "http://example.jp/list/item1"}
]
このとき、リクエストは[http://example.jp/list] に対するGETだと言える。
リクエストに対して、サーバは指定されたURIに対応するデータをレスポンスとして返す。
#2. POST -> リソースの作成、追加
GETに次いで利用頻度が高い!
3つの役割があるよー
##( i ) 子リソースの作成
POSTの代表的な機能で、あるリソースに対する子リソースを作成することができる。
ブログ記事の投稿などで使われる。
POST /list HTTP/1.1
Content-Type: text/plain; charset=utf-8
Qiitaでの初投稿!
HTTP/1.1 201 Created
Content-Type: text/plain; charset=utf-8
Location: http://example.jp/list/item5
Qiitaでの初投稿!
このリクエストは [http://example.jp/list] に対して、新しい子リソースを作るようにPOSTで指示している。
レスポンスでは[201 Created]というステータスコードが返ってきており、新しいリソースが生成されたことが分かる。
##( ii ) リソースへのデータの追加
子リソース作成ほどメインで使わないが、既存リソースへのデータの追加もできる。
GETしたリソースに対して...
POST /log HTTP/1.1
Host: example.jp
2017-02-24T10:13:00Z, GET /log, 200
HTTP/1.1 200 OK
このときレスポンスは[200 OK]が返ってくる。
これはリクエストが新規リソースの作成ではなく、データの追加を意味しているため。
##( iii ) ほかのメソッドでは対応できない処理
POSTの3つ目の機能は、ほかのメソッドでは対応できない処理の実行。
例として、検索結果を表示するURIが挙げられる。
http://example.jp/search?q={検索キーワード}
通常はこのURIをGETできるが、検索キーワードがとてもながーい場合、URIにキーワードを入れてGETする方式は使えない。これはURIを実装する上で、2000文字の制限があるため。
こういうときにPOSTを使う。
POST /search HTTP/1.1
Content-Type: application/x-www-form-urlencoded
q=very+long+keyword+foo+bar+...+....
GETがキーワードをURIに含めるのに対して、POSTはリクエストボディに入れることができる。そのため、どんなにながーいキーワードにも対応できる。素晴らしい。
#3. PUT -> リソースの更新、作成
2つの機能を持っているよ
##( i ) リソースの更新
リソースを更新する前にまずGETするよー
GET /list/item5 HTTP/1.1
Host: example.jp
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Qiita初投稿!
PUTを使って「Qiita初投稿!」から「実は2回目!」に更新していくと...
PUT /list/item5 HTTP/1.1
Host: example.jp
実は2回目!
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
実は2回目!
これで更新完了!
( ii ) リソースの作成
POSTでもできるリソースの作成がPUTでもできる。
例えば [http://example.jp/newitem] がまだ存在しないとする。
このとき、
PUT /newitem HTTP/1.1
Host: example.jp
Content-Type: text/plain; charset=utf-8
新しいリソース/newitemの内容
HTTP/1.1 201 Created
Content-Type: text/plain; charset=utf-8
新しいリソース/newitemの内容
このとき、PUTは存在しないURIへのリクエストとなるため、サーバは新しくリソースを作成すると解釈する。
そして、リクエストが成功すると[201 Created]を返す。
/newitemが存在していた場合は、ただの更新処理になる。
#4. DELETE -> リソースの削除
DELETEは言葉のまんま、リソースを削除するメソッド
DELETE /list/item2 HTTP/1.1
Host: example.jp
HTTP/1.1 200 OK
一般的に、DELETEのレスポンスはボディを持たない。そのためレスポンスのステータスコードにはボディがないという意味で、[204 No Content]が使われる場合もある。