目次
GitHub Actions とか CI/CD が好きです。
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
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Android における非同期 HTTP 通信Android で利用される HTTP クライアントには Volley や OkHttp がありますが、ここでは Android プラットフォームに標準で導入されている [HttpsURLConnection](https://developer.android.com/reference/javax/net/ssl/Https
- Scala HTTP 通信ビルドツールの設定 Dispatch を利用します。 pom.xml (maven) <dependency> <groupId>net.databinder.dispatch</groupId> <artifactId>dispatch-core</artifactId> <version>0.11.2</...
- Squid の簡単な設定例HTTP Proxy として利用される squid について、設定例を記載します。 localnet の定義 127.0.0.1 に対しては localhost および to_localhost という組み込みの名称のキーワードが利用できます。その他のプライベートIP に対するキーワードは独自に定義する必要があります。 acl localnet src 0.0.0.1-0.255.255.255 ...
- HTTP 経由でファイルシステムをマウント (WebDAV、davfs2)HTTP の拡張である WebDAV を利用すると、サーバ上のファイルシステムを HTTP で外部に公開できます。Debian9 を利用した設定例を記載します。HTTP サーバとしては Apache を利用します。 Apache の設定 必要なパッケージをインストールします。 sudo apt install apache2 公開するディレクトリを用意します。 sudo mkdir -p /dat...