HTTP1.1のメソッドまとめ

Pocket

HTTPメソッドってGETとPOST以外にあと何があった?

Webアプリケーションを開発するうえで、HTTPについてあまり意識しないで開発をしている人が多いのではないでしょうか?
もちろん、私もその一人ですw
HTTPメソッドって、GETPOSTのやつでしょ!?的な感じで、他にわかるのは、かろうじてPUTDELETEくらい、、、
他にもHTTPメソッドはあるけど、使ったことがあるかどうかもよくわかんない状態だった、、、
また、効率の良いWebアプリケーションを開発したり、技術的に正しい挙動をするWebアプリケーションを開発する上では、HTTPメソッドについて詳しく知っていることが必要不可欠と感じたので、HTTPメソッドについて調べてみた。

GETとHEADメソッド

GETメソッドは、普段よく使っているので知っていると思いますが、念のために、、、
GETメソッドは、指定したURLのリソースの取得するHTTPメソッドです。
nc(netcat)コマンドを使ってHTTPメッセージを覗いてみると

GET /index.html HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Sun, 22 Oct 2016 11:19:36 GMT
Content-Type: text/html
Content-Length: 2494
Last-Modified: Sun, 14 Aug 2016 09:56:12 GMT
Connection: close
ETag: "57b0403c-e"
Accept-Ranges: bytes

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
------省略------

4行目以降がレスポンスです。
このように、レスポンスヘッダとレスポンスボディが返ってきています。

このGETメソッドと似ているのが、HEADメソッドです。
GETとHEADの違いは、HEADメソッドはレスポンスヘッダだけ要求して、レスポンスボディは取得しない点です。

HEAD /index.html HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Sun, 22 Oct 2016 11:21:37 GMT
Content-Type: text/html
Content-Length: 2494
Last-Modified: Sun, 14 Aug 2016 09:56:12 GMT
Connection: close
ETag: "57b0403c-e"
Accept-Ranges: bytes

HEADメソッドは、ボディを取得する前にそのリソースがどのようなコンテンツなのかレスポンスヘッダのContent-TypeContent-Lengthから判断します。
GETメソッドでリクエストを送る前などに、そのリソースにはどんなコンテンツなのかを調べるときにHEADメソッドを使います。

POSTとPUTとDELETEメソッド

POSTメソッドPUTメソッドは、どちらもリソースを作成できます。
POSTメソッドとPUTメソッドの使い分けは、いろいろと論争があるそうですが、、、
Webを支える技術には

これには正解は存在しませんが、設計上の指針として次の事実があります。 POSTでリソースを作成する場合、クライアントはリソースのURIを指定できません。URIの決定権はサーバ側にあります。逆にPUTでリソースを作成する場合、リソースのURIはクライアントが決定します。

また

一般的に、クライアントがリソースのURIを決定できるということは、クライアントを作るプログラマがサーバの内部実装(URIにどの文字を許すのか、長さの制限はどれくらいかなど)を熟知していなければなりません。 そのため、PUTのほうがどうしてもサーバとの結合が密になります。特別な理由がない限りは、リソースの作成はPOSTで行いURIもサーバ側で決定する、という設計が望ましいでしょう。

とあります。
RESTの視点からでも、クライアントがリソースのURIを意識するというのは、好ましくないので、リソースの作成にはPOSTを使う方がいいでしょう。
PUTは、リソースの作成に使うのではなく更新のときに使う方が良さそう。
DELETEメソッドはその名の通りで、リソースの削除するときに使います。

OPTIONSとTRACEとCONNECTメソッド

OPTIONSメソッドは、URIに対して利用できるメソッドの一覧を取得するメソッドです。
すべてのリソースはすべてのメソッドに対応していないことがあるので、そのようなときに、どんなメソッドが対応しているのかを知らせるときに使うのがOPTIONSメソッドです。

OPTIONS * HTTP/1.1

HTTP/1.1 200 OK
Date: Mon, 22 Oct 2016 14:46:11 GMT
Server: nginx/1.4.6 (Ubuntu)
Allow: GET.POST.DELETE.OPTIONS
Content-Length: 0
Connection: close
Content-Type: text/plain

TRACEメソッドは、クライアントからのリクエストした内容をそのままレスポンスで返すメソッドです。
サーバまでの経路をチェックするときに使います。

CONNECTメソッドは、プロキシにトンネリング通信を要求するメソッドです。
SSLなどで暗号化した通信をするときに、クライアントとプロキシの間のセッション、プロキシとサーバーの間のセッションは暗号化されます。
SSLを使って安全に通信を行うことができても、プロキシからはデータを判断できないので、そんなときにCONNECTメソッドを使います。

まとめ

そんな感じでざっと調べた結果を以下の表に各HTTPメソッドについてまとめたので整理するときの参考にしてください。

メソッド 説明・用途
GET URIに指定したリソースの転送を行い、サーバからリクエストを送ったリソースのデータを受け取る。
HEAD GETと似ているが、レスポンスヘッダだけを要求して、レスポンスボディは取得しない。GETの前にどのようなリソースが返ってくるのかを調べるのに使う。
POST クライアントからサーバにデータを送信し、リソースを作成する。フォームなどでデータを送信するときに使う。
PUT リソースを更新する。またリソースの作成もできるがPOSTに任せた方が良さげ
DELETE リソースを削除する。
OPTIONS リソースで使用できるリクエストメソッドの取得。通信オプションを通知したり調べるときに使う。
TRACE リクエストをそのまま返却する。サーバ側で受け取ったリクエストラインとヘッダーをそのままクライアントに送り返す。プロキシサーバなどを使う環境で、リクエストが書き換えられる様子を調べるときに使う。
CONNECT リソースで指定されたサーバにトンネルを確立する。暗号化したメッセージをプロキシで転送する際に使う。

OPTIONSやTRACEあたりはすぐに忘れそう、、、

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>