PythonでWebプログラミングの基礎(その4)HTTPの理解

前回の続きです。前回は、WebプログラミングのためのTCP/IPの基礎について書きました。今回はTCP/IPの最上位階層に位置するHTTPについて書きます。

WebプログラミングとしてはこのHTTPをどう使いこなすかがまず課題です。実際にブラウザ等での動作も試して実際のWebプログラミングの基礎になるように書いてみます。前回の内容も必要に応じて再度書きます。

HTTP(HypertText Transfer Protocol)の仕様基礎
リクエストとレスポンス
クライアント側からサーバ側へリクエストを送信してサーバがクライアントにレスポンスを返します。

メソッド
サーバにどのような動作を要求するかの表現方法、代表的ものは、GETとPOSTです。

ステータスコード
レスポンスの種類を番号とメッセージで表現したもの、例として、「200 OK」「404 Not Found」があります。

ブラウザでHTTPのシーケンス確認
ここでのシーケンスとはサーバへの接続からHTTPのリクエストとレスポンスのやり取りと接続断までです。

まず、ブラウザで以下のURLを入力して表示を確認します。
www.example.com または、example.com
(※ここはWebコンテンツのサンプルとして使っていいように管理されているサイトのようです。)

どちらでも同じですが、以下のようになると思います。

これを以下のURLで表示させて下さい。表示結果は上と同じです。
http://www.example.com:80/index.html

どういうことかと言いますと、既定の内容として省略されている情報を全て指定するとこのようになるということです。これらの情報で、以下のように接続先の指定からHTTPのリクエストまで表現されています。

ドメイン名:example.com => 最終的な接続先サーバのIPアドレスが分かる
ポート番号:80 => 接続先されたサーバの更にアプリケーションの接続先が分かる
プロトコル名:http:// => HTTPプロトコルの指定
GETリクエスト:index.html => GETメソッドで取得したいコンテンツ(ここではindex.htmlというファイル)

これで前回のTCP/IPの階層構造での通信が設立してindex.htmlが取得出来てブラウザの画面に表示されます。

つまりブラウザでは、URLでHTTPのGETリクエストが送信出来て、正常なレスポンスが取得出来た場合はその内容がブラウザに表示されます。エラーの場合はそのステータスコードが表示されます。

このシーケンスを簡単ですが、以下のように表現してみました。

-------------------------
ブラウザ          Webサーバ
(クライアント)       (サーバ)

TCP接続   ----->  
リクエスト  -----> リクエストの解析と
GET、POST等        レスポンスの生成

結果の表示  <----- レスポンス
 
(必要なリクエスト送信とレスポンスの繰り返し)

       <----- TCP接続断、解放
-------------------------

これは本当に基本的なシーケンスですが、元々は文字通り、(ハイパーテキスト)文書を交換するためのプロトコルだったのでこうなったと思います。今現在でも基本的にはこのリクエストとレスポンスの流れですが、様々な仕様の拡張が行われています。

telnetでシーケンスの確認
telnetを使ってブラウザで見たページのリクエストとレスポンスを見てみます。telnetとは遠隔接続でコマンド操作を行うためのツールですが、単純にTCP接続を画面と直結させてテキストデータを確認することが出来ます。apt-get install で導入出来ます。他にもブラウザの開発ツール等で同様のことが出来ると思いますが、昔ながらのtelnetを使います。

やってみます。

ここでの環境はWindows10のWSL(debian)です。以下のように接続します。
$ telnet www.example.com 80

www.example.com の接続先にポート番号80でTCP接続されます。ブラウザからURLで入力するのと同じような接続です。

以下のように接続されました。

以下のGETリクエスト文字列をコピーペーストで入力します。
GET / HTTP/1.1
HOST: example.com

以下のようになります。

Enterを2回入力します。以下のようにレスポンスが返ってきました。

レスポンスヘッダとレスポンスで構成されています。

レスポンスヘッダには以下のようなステータスが含まれています。これは正常終了です。
HTTP/1.1 200 OK

あと以下でレスポンスは htmlのテキストだと判別出来ます。
Content-Type: text/html; charset=UTF-8

実際のレスポンスはまさにindex.htmlファイルの内容です。ブラウザでページのソースを確認した場合と同じです。

ここまではHTTPのGETメソッドでのリクエストとレスポンスの流れでした。POSTの場合も同様な流れですが、POSTの場合はリクエストの最後にパラメータが付与されます。パラメータとはサーバ側に渡すデータのことです。

Webプログラミングへの応用
ここまでのHTTPの基礎をWebプログラミングへどう繋げるかです。

以下でCGIを使って現在時刻を表示するプログラムを作成しました。これは単純ですが、動的なレスポンスを生成して返すプログラムです。
PythonでWebプログラミングの基礎(その2)CGIで動的ページの表示

ここからさらに、今回のリクエストとレスポンスの流れにを使えば以下のようなCGIプログラムが作成出来るようになります。
リクエストとリクエストパラメータを解析する(入力の受け取り)
その内容に従ってサーバ側(CGI)で何かの処理をする
処理結果をレスポンスとして返す(出力を返す)

これらの入力から出力の流れでプログラミングの基礎が習得出来るのではという狙いです。他に、HTMLの基礎やHTMLページの構成についても理解が深まると思います。

さらにですが、CGIでは実務的なプログラムは難しいので、PythonでのWebアプリケーションのフレームワークを使った開発へも進めるかと思います。私はまだ使ったことはないですが、例えばDjangoというフレームワークが有名なようです。

もっともそこまで進むにはそれなりのやり方、モチベーション、時間等がどうしても必要になってきます。もちろんですが、自分には向いていないとか、興味が持てないということであれば無理して勉強する必要は全くないです。

私自身は随分前ですがCGIでの実務的な開発実績があります。その後もいろいろな開発言語、フレームワークでのWebアプリケーションの開発も何とか出来ました。これからもやっていこうと思っています。

今回はここまでです。次回からまたCGIプログラムについて書きます。次回へ進む