HTTP#
HTTP (Hyper Text Transfer Protocol) は、Web サーバと Web クライアントの間でデータを送受信するためのプロトコル(決まりごと)です。 基本的には状態を持たず、1つのリクエストにつき、1つのレスポンスが返されるという特徴があります。 リクエストとレスポンスの構造は次の通りです。


リクエストもレスポンスも、ヘッダとボディに分けられ、ヘッダとボディは空行で区切られます。 リクエストのヘッダは、1行目にHTTPのメソッド、リソースのパス、HTTPのバージョンが記述されます。 そして、2行目以降にリクエストヘッダが続きます。
レスポンスのヘッダは、1行目にHTTPのバージョン、ステータスコードが記述されます。 そして、2行目以降にレスポンスヘッダが続きます。 レスポンスのボディには、リクエストしたリソースのデータ(HTMLや画像など)が含まれます。
HTTP メソッド#
HTTP メソッドは、リクエストの目的を示すためのものです。 リクエストの1行目に記述されるメソッドによって、リソースに対する操作が決まります。 代表的なメソッドは次の通りです。
GET:リソースの取得POST:リソースの作成PUT:リソースの更新DELETE:リソースの削除
ブラウザでHTMLページを表示するときは GET メソッドが使われます。
<form>を使ってデータを送信するときは POST メソッドが使われることが多いです。
HTTP のステータスコード#
HTTP のステータスコードは、リクエストの結果を示すためのものです。 ステータスコードは、3桁の数字で表され、次のような意味があります。
1xx:情報100:リクエストを受け付けた。
2xx:成功200:リクエストが成功した (OK)201:リソースが作成された (Created)
3xx:リダイレクト301:リソースが移動した (Moved Permanently)
4xx:クライアントエラー400:不正なリクエストであった (Bad Request)404:リソースが見つからない (Not Found)
5xx:サーバエラー500:サーバ内部エラー (Internal Server Error)
適切なステータスコードを返すことで、クライアントにリクエストの結果を伝えることができます。
HTTP リクエストの例#
curlコマンドは、コマンドラインから HTTP リクエストを送信するためのコマンドです。
-i オプションを付けると、レスポンスヘッダが表示されるようになります。
example.com#
次の例は、curlコマンドを使って、http://example.com に GET リクエストを送信する例(curl -i http://example.comの実行結果)です。
HTTP/1.1 200 OK # ステータスコード。200 だから成功した。
Accept-Ranges: bytes # 以降レスポンスヘッダ。ヘッダの順序に意味はない。
Age: 510491
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8 # レスポンスボディがどのような形式で記載されているか。
Date: Sat, 02 Nov 2024 00:48:47 GMT # レスポンスが返された日時
Etag: "3147526947"
Expires: Sat, 09 Nov 2024 00:48:47 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECAcc (lac/558F)
Vary: Accept-Encoding
Content-Length: 1256 # レスポンスボディの長さ。
X-Cache: HIT # 続いて空行があるので、これでヘッダは終わり。
<!doctype html>
... 以降省略google.co.jp#
次の例は、curlコマンドを使って、https://google.co.jp に GET リクエストを送信する例(curl -v https://google.co.jpの実行結果)です。
-v オプション(verbose; 冗長な)を付けるとリクエストヘッダも表示されるようになります。
* Host google.co.jp:443 was resolved. # * から始まる行は、curl が出力する情報。
* IPv6: (none)
* IPv4: 142.251.42.163
# ... 途中省略
> GET / HTTP/2 # > から始まる行は、リクエストを表す。
> Host: google.co.jp
> User-Agent: curl/8.7.1
> Accept: */*
>
* Request completely sent off # < から始まる行は、レスポンスヘッダを表す。
< HTTP/2 301 # 301 は恒久的に移動したことを示すステータスコード。
< location: https://www.google.co.jp/ # 移動先のURL。ブラウザでアクセスした場合、ブラウザは、このURLに対して、もう一度リクエストを送る。
< content-type: text/html; charset=UTF-8
# ... 途中省略
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>
* Connection #0 to host google.co.jp left intact