HTTPとは
HTTPの概要
HTTPとは、WebサーバとWebクライアントの間でデータの送受信を行うために用いられるプロトコル e-words.jp
HTTP通信の中身
- HTTPでサーバとクライアントがやりとりするメッセージ(HTTPメッセージ)は基本的に以下のような形になっている
メッセージヘッダ 空行(CR+LF) メッセージボディ
- リクエストメッセージ(クライアント=>サーバへのメッセージ)は具体的には以下のようなものである
GET /index.html HTTP/1.1 Host: localhost:8080 Connection: keep-alive User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36 Accept: */* Referer: http://localhost:8080/ Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6
※今回は、リクエストメソッドがGETのため、リクエストボディは存在しない(存在する場合については後述する)
リクエストヘッダ
- 2行目~ 空行までの部分
- リクエストについての情報や属性が書かれている
リクエストライン
- 1行目の以下の部分
GET /index.js HTTP/1.1
このステータスラインの個々の部品を左から
- GET = リクエストメソッド
- /index.html = リクエストURI
- HTTP/1.1 = HTTPのバージョン
という
リクエストメソッド
- クライアントからサーバに対するリクエストの方法(基本的にGETかPOST)
リクエストURI
- クライアントからサーバに対するリクエスト対象のリソース(サーバ内に保管されているリソース)
HTTPのバージョン
この通信で使うHTTPのバージョン
簡単に言うと、/index.htmlというリソースを、HTTPの1.1バージョンの通信で、GETというリクエストの方法で、クライアントからサーバに要求している。
GETとPOST
HTTPのメソッドは、その用途によってGETとPOSTで使い分ける必要がある。
GET
- HTTP通信で、サーバから情報を取得してくる時に使用する
- 他人に見られたくない情報は、GETでは送らない(後述する)
- 送信できるデータ量に制限がある
- ブックマークに保存する場合
- テキストデータのみ送信できる(バイナリデータは送信できない)
GETでのサーバへのデータの送信方法
- リクエスト時にサーバへ送信するデータはリクエストURLの後に付け加えられる
http://localhost:8080/index.html?hoge=hoge
- ?より後の文字をクエリストリングといい、送信するデータを表す(クエリストリングについては後述)
- このように送信するデータがアドレスバーに表示されてしまうため、他人に見られる可能性があるので、他人に見られたくない情報は、GETでは送らない
クエリストリング
クエリ文字列とは、WebブラウザなどがWebサーバに送信するデータをURLの末尾に特定の形式で表記したもの。 Webアプリケーションなどでクライアントからサーバにパラメータを渡すのに使われる表記法で、URLの末尾に「?」マークを付け、続けて「名前=値」の形式で記述する。値が複数あるときは「&」で区切り、
例えば
http://example.com/foo/var.php?name1=value1&name2=value2
のように記述する。
下記の?hoge=1&foo=2がクエリストリングに該当する
http://localhost:8080/index.html?hoge=1&foo=2
- 「名前=値」の形で表される
この場合は以下の2つのデータを送信していることがわかる
「hogeが名前、1が値」、「fooが名前、2が値」
パーセントエンコーディング(URLエンコーディング)
- 日本語などの文字は、そのままではURLで送信することができない
- そのような文字をURLに付与して送信するには、パーセントエンコーディング(URLエンコーディング)という技術を使用する。
- URLで扱えない文字を「%xx」(xx:16進数)で表現する
- XXの部分は、使用する文字コードによって異なる
このパーセントエンコーディングはHTTP通信においては、以下の箇所で利用される
- URLのパス
- クエリストリング(GETパラメータ部分)
- リクエストボディ(POSTパラメータ)
POST
- HTTP通信で、サーバへ情報を登録する時に使用する(データベースへの格納など)
- データ量が多い場合(GETでのデータ送信量制限を超えてしまう場合)
- バイナリデータを送信したい場合
- 他の人に見られたくない情報を送る場合(パスワードなど)
POSTでのサーバへのデータの送信方法
- POSTでサーバにデータを送信する際は、リクエストボディにデータが記述される
- POSTでのサーバからクライアントへのリクエスト例
POST /hoge/ HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 22 Cache-Control: max-age=0 Origin: http://localhost:8080 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://localhost:8080/hoge/ Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 name=hoge&comment=hoge
- 上記のように、リクエストヘッダの後に一行、空行が入り、その後POSTで送信したクエリストリングが、リクエストボディとしてクライアントからサーバへと送信されてくる
- リクエストボディの長さは、「Content-Length:」という項目で表される
Webサーバ(HTTPサーバ)とは
- クライアントからのリクエストに対して静的なリソースを返す
- 動的なリソースを返したい場合は、アプリケーションサーバ
参考にさせていただいたサイト
https://www.ietf.org/rfc/rfc2616.txt(rfc2616)
https://www.ietf.org/rfc/rfc3986.txt
参考文献
※ Qiitaでも同一記事を投稿している qiita.com