🐥
学習備忘録〜「Webを支える技術」第7章〜
はじめに
この備忘録は、新卒2年目の初学者バックエンドエンジニアの学習記録のためにつけているものです。
解釈違いや、誤情報がある可能性があります。見つけた際にはご指摘をお願いします。
新規プロジェクトにアサインしてもらうことも増えてきて、基礎知識から定着させていきたいと思い学習備忘録第二弾が始まります。
第7章〜HTTPメソッド〜
8つしかないメソッド
- HTTPメソッドには、クライアントが行いたい処理をサーバに伝えるという重要な任務がある
- メソッドは8つあり、その中でも使うのは5つか6つ
| メソッド | 意味 |
|---|---|
| GET | リソースの取得 |
| POST | 小リソースの作成、リソースへのデータの追加、その他の処理 |
| PUT | リソース更新、リソースの作成 |
| DELETE | リソースの削除 |
| HEAD | リソースのヘッダの取得 |
| OPTIONS | リソースがサポートしているメソッドの取得 |
| TRACE | 自分宛にリクエストメッセージを返す試験 |
| CONNECT | プロキシ動作のトンネル接続への変更 |
HTTPメソッドとCRUD
- HTTPメソッドのうち、GET,POST,PUT,DELETEは、「CRUD」という性質を満たすため、代表的なメソッドである
CRUDとは?
Create(作成:POST)
Read(読み込み:GET)
Update(更新:PUT)
Delete(削除:DELETE)
GET
- 指定したURIの情報を取得
- 最も使用頻度の高いメソッド
- Webページの取得、画像取得、映像の取得、フィードの取得等、ブラウザを使用する際は数多くのGETを発行する
リクエスト例
GET/list HTTP/1.1
Host: example.jp
レスポンス例
HTTP/1.1 200 OK
Content-Type: application/json
[
{"url": "http://example/jp/list/item1},
{"url": "http://example/jp/list/item2}
]
POST
- GETの次に使用頻度の高いメソッド
- 主に3つの役割
- 子リソースの作成
- リソースへのデータの追加
- 他のメソッドでは対応できない処理
子リソースの作成
- ブログ記事の投稿等の操作で使われる
リクエスト例
POST /list HTTP/1.1
Host: example.jp
Content-Type: text/plain; charset=utf-8
こんにちは!
レスポンス例
HTTP/1.1 201 Created
Content-type: text/plain; charset=utf-8
Location: http://examp;e.jp/list/item5
こんにちは!
リソースへのデータの追加
- 既存リソースへのデータの追加
リクエスト例
POST /log HTTP/1.1
Host: example.jp
2010-10-10T10:13:00z, GET /log, 200
レスポンス例
HTTP/1.1 200 OK
他のメソッドでは対応できない処理
- URLが2000文字以上と非常に長い場合等
- URIにキーワードを入れてGETする方法を利用できない
- POSTのリクエストボディに入れて対応可能
PUT
- リソースの更新
- リソースの作成
リソースの更新
リクエスト例
PUT /list/item5 HTTP/1.1
Host: example.jp
Content-Type: text/plain; charset=utf-8
こんばんわ!
レスポンス例
HTTP/1.1 200 OK
Content-type: text/plain; charset=utf-8
こんばんわ!
リソースの作成
- リクエストのURIが存在しない場合、サーバはリソースを新しく作成すると解釈し、リクエストが成功した201を返す
- PUTの場合はクライアントがすでにリソースのURIを知っているためLocationヘッダを返す必要はない
リクエスト例
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の内容
POSTとPUTの使い分け
- 特別な理由がない限り、リソースの作成はPOSTで行い、サーバにURIを決めてもらうのが望ましい
DELETE
- リソースを削除するメソッド
- DELETEのレスポンスは一般的にボディを持たない
リクエスト例
DELETE /list/item2 HTTP/1.1
Host: example.jp
レスポンス例
HTTP/1.1 200 OK
HEAD
- GETによく似たメソッド
- HEADはリソースのヘッダだけを取得するメソッド
- HEADのレスポンスにはボディが含まれない
- ネットワークの帯域を節約しながらリソースの大きさを調べたち、リソースの更新日時を取得したりできる
リクエスト例
HEAD /list/item2 HTTP/1.1
Host: example.jp
レスポンス例
HTTP/1.1 200 OK
Content-type: text/plain; charset=utf-8
OPTIONS
- リソースがサポートするメソッドの一覧を返す
リクエスト例
OPTIONS /list HTTP/1.1
Host: example.jp
レスポンス例
HTTP/1.1 200 OK
Allow: GET, HEAD, POST
リクエスト例
OPTIONS /list/item1 HTTP/1.1
Host: example.jp
レスポンス例
HTTP/1.1 200 OK
Allow: GET, HEAD, PUT, DELETE
POSTでPUT/DELETEを代用する方法
- HTTPの主なメソッドは6つあるが、実際に頻繁に使われるメソッドはGETとPOSTの2つ
- HTMLのフォームで指定できるメソッドがGETとPOSTだけという制限に起因する
- 携帯電話向けブラウザはフォームしか利用できず、GETとPOST以外は使えない
- セキュリティ上の理由から、プロキシサーバでもGETとPOST以外のアクセスを制限していることもある
- この状況下でサーバにPUTやDELETEを伝える手段が2つ
- _methodパラメータ
- X-HTTP-Method_Override
_methodパラメータ
- フォームの隠しパラメータ(hidden)に_methodパラメータを用意して、そこに本来送りたかったメソッドの名前を入れる
- _methodパラメータはRuby on Railsが採用している
例
<form action="/list/item1" method="POST">
<!-- DELETEメソッドを指定 -->
<input type="hidden" id="_method" name="_method" value="PUT">
...
</form>
リクエスト例
POST /list/item1 HTTP/1.1
Host: example.jp
Content-Type: application/x-www-form-urlencode
_method=PUT&body...
X-HTTP-Method_Override
- POSTの内容がXML等、application/x-www-form-urlencode以外の場合は-methodが使用できない
- このような場合に利用できるのがX-HTTP-Method_Overrideヘッダ
POST /list HTTP/1.1
Host: example.jp
Content-Type: text/plain; charset=utf-8
X-HTTP-Method_override: PUT
冪等性と安全性
- 通信エラーが発生した際にリクエストをどのように回復するのかがHTTPでは大事
- 冪等とは「ある操作を何度行っても結果が全て結果が同じこと」
- 安全とは「操作対象のリソースの状態を変化させないこと」
| メソッド | 性質 |
|---|---|
| GET, HEAD | 冪等かつ安全 |
| POST, DELETE | 冪等だが安全ではない |
| PUT | 冪等でも安全でもない |
Discussion