HTTPの簡単なまとめ
[履歴] [最終更新] (2016/08/06 05:51:42)

概要

HTTP (Hypertext Transfer Protocol) はTCP/IPにおけるアプリケーション層プロトコルのひとつです。大まかにはリクエストとレスポンスの二種類によるやりとり方法を定めています。

リクエスト

代表的なリクエストメソッドはGETとPOSTですが、他にもPUTやDELETEなどがあります。いずれもリクエストラインが一行目にきて、空白区切りで「リクエストメソッド、リクエストURL、HTTPのバージョン」の三つを指定します。二行目からは": "で区切られたヘッダが続きます。リクエストメソッドによっては (POSTなど) 空行で終了したヘッダのあとにボディが続きます。

GET

具体例:

GET /search?q=ruby HTTP/1.1
Host: www.qoosky.io
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: toolbarDisplay=hide
Connection: keep-alive
  ←(空行)

GETで必須となるヘッダはHostのみです。Hostヘッダにはホスト名 (FQDN) とポート番号 (80の場合は省略可能) が指定されます。なお、一行目のリクエストラインにはブラウザごとに決められた上限の長さがあります。

POST

「リクエストライン、ヘッダ、空行、メッセージボディ」からなります。

例:

POST /path/to/resource.php HTTP/1.1
Referer: http://www.example.com/from.php?id=123
Content-Type: application/x-www-form-urlencoded
Content-Length: 128
Host: www.example.com

name=hoge%27hoge&val=123

Content-TypeはMIMEタイプとよばれるリソースの種類を指定するヘッダで、HTMLのformで指定可能です。省略するとapplication/x-www-form-urlencodedになります。これはGETリクエストのようにパーセントエンコードされたもので、特殊記号やマルチバイト文字は%xxを一つ以上用いて表現されます。ただし空白は特別に%20ではなく'+'となります。また、Content-Lengthはメッセージボディ部のサイズ (バイト数) です。

最後に、RefererヘッダにはPOST元 (formがあったページ) のURLが記載されます。英語的に正しいReferrerではなく、つづりミスのRefererです。Refererヘッダには、他にもGETリクエスト時のリンクもと (aリンク (href) を踏んだページ) のURLが記載されます。このように、サーバ側のメリットとしてどこから来たのか把握できる一方で、クライアント側で容易に改変可能であるため絶対的には信用できない情報です。また、例えば悪意あるユーザが自分のサーバへのリンクをコメント欄に埋めこむと、それを踏んだユーザのURLがRefererでバレたりします。もしURLにセッションIDなどが含まれている場合は大変なことになりますね。

レスポンス

「ステータスライン、ヘッダ、空行、ボディ」からなります。一行目のステータスラインには空白区切りで「HTTPのバージョン、ステータスコード、テキストフレーズ」が記載されます。テキストフレーズはステータスコードの人間用の訳のようなものです。

具体例:

HTTP/1.1 302 Found
Date: Mon, 09 Sep 2013 14:24:09 GMT
Server: Apache/2.2.15 (CentOS)
Location: https://www.qoosky.io/search?q=ruby
Content-Length: 300
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://www.qoosky.io/search?q=ruby">here</a>.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at www.qoosky.io Port 80</address>
</body></html>

上記の例ではhttpでアクセスしてしまったユーザをhttpsにリダイレクトしています。ステータスコードについて簡単にまとめます:

  • 1xx: 処理が継続している
  • 2xx: 正常終了
  • 3xx: リダイレクト
  • 4xx: クライアントエラー (ファイルがない場合は404)
  • 5xx: サーバーエラー (内部サーバーエラーは500、nginx などがリバースプロキシとして動作して上位サーバからレスポンスを得られない場合は 502 Bad Gateway を nginx が返す)

Content-Type (MIMEタイプでリソースの種類を指定) の例:

  • text/plain
  • text/html
  • text/css
  • application/xml
  • application/pdf
  • image/jpeg
  • image/png
  • image/gif
関連ページ
    概要 (元ページ https://dev.twitter.com/docs/auth/oauth) TwitterではOAuth認証によるAPI利用が可能です。TwitterAPIにはv1.1とv1.0が存在していますが、v1.1を使用するようにしてください。TwitterAPIv1.1においてサポートされているOAuthのバージョンは「OAuth 1.0A」です。TwitterAPIv1.1
    概要 Android で利用される HTTP クライアントには Volley や OkHttp がありますが、ここでは Android プラットフォームに標準で導入されている HttpsURLConnection (HttpURLConnection) を利用します。 また、Android では HTTP 通信を main スレッドではなくバックグラウンドの別スレッドで非同期に行う必要があり、
    概要 本ページを最初に投稿した 2013/11/10 から 2016/07/24 現在にいたるまでに Arduino のインターネット接続に関する環境がかなり改善されてきましたので、改めて情報をまとめます。 四つの選択肢 WiFi シールド Arduino に接続することで WiFi の機能を拡張できるボードです。公式ページは以下のとおりです。
    概要 こちらのページでは、Java のソースコードにハードコーディングしたユーザーとパスワードの情報をもとに、Spring Security でログインフォーム認証を行いました。本ページではユーザー認証を LDAP サーバーからの情報をもとに行います。 Spring LDAP が提供する LDAP クライアントを
    概要 Ajax (Asynchronous JavaScript + XML) は JavaScript でサーバと非同期通信を行うための仕組みです。非同期通信には JavaScript の仕様として標準で提供されている XMLHttpRequest オブジェクトを利用することが多いです。XMLHttpRequest は Ajax のためのオブジェクトではなく HTTP 通信を行うための汎用オブ
    概要 HTTP Proxy として利用される squid について、設定例を記載します。 localnet の定義 127.0.0.1 に対しては localhost および to_localhost という組み込みの名称のキーワードが利用できます。その他のプライベートIP に対するキーワードは独自に定義する必要があります。