🐥

学習備忘録〜「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
  • 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