「WordPressで学ぶPHP(4)通信編」を発売しました。
本書は、「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造編」「WordPressで学ぶPHP(3)関数編」の続編にあたり、Webブラウザとサーバー(PHP)との通信と、PHPから他のサーバーに通信することについて解説します。
Node.jsを学ぶ(その3・アドレスに応じて出力を分ける)
前回紹介したプログラムでは、アクセスされたアドレスに関係なく、出力は常に同じでした。
しかし、現実的なWebサーバーを作るなら、アドレスに応じて出力を変えられることが必要です。
そこで、その方法を解説します。
1.urlプロパティ
リクエストに関する情報は、リスナーに渡される1つ目のパラメータに格納されます。
このパラメータはhttp.IncomingMessageというオブジェクトになっています。
http.IncomingMessageには、いくつかのプロパティがあります。
アクセスされたURL(のホスト名/ポート番号から後の部分)は「url」というプロパティから得ることができます。
例えば、「http://localhost:8080/abc/def?ghi=jkl」のアドレスにアクセスされたとします。
この場合、urlプロパティの値は「/abc/def?ghi=jkl」になります。
2.URLをパースする
URLをパースして、個々の部分の情報を得るには、「url」というモジュールのparseメソッドを使います。
パラメータとして、パースしたいURLを渡します。
メソッドの戻り値は、個々の情報を格納したオブジェクトになります。
オブジェクトには以下のようなプロパティが含まれます。
| プロパティ | 内容 |
|---|---|
| href | パースするURLそのもの |
| pathname | パスの部分(クエリ文字列より前の部分) |
| search | クエリ文字列全体(「?」とその後の部分) |
| query | parseメソッドのパラメータにより変化 |
| path | pathnameとsearchを連結した値 |
例えば、parseメソッドで「/abc/def?ghi=jkl」をパースするとします。
また、parseメソッドのパラメータとして、URLだけを渡すとします。
すると、結果のオブジェクトの内容は、以下のようになります。
| プロパティ | 値 |
|---|---|
| href | /abc/def?ghi=jkl |
| pathname | /abc/def |
| search | ?ghi=jkl |
| query | ghi=jkl |
| path | /abc/def?ghi=jkl |
なお、queryプロパティの使い方は、後日紹介します。
3.事例
前回のプログラムを書き換えて、アクセスされたアドレスに応じて、以下のようにレスポンスを返すようにします。
| アドレス | レスポンス |
|---|---|
| http://localhost:8080/ | Document root |
| http://localhost:8080/hello | Hello, node.js |
| その他 | Not found |
実際にプログラムを組むと、以下のようになります。
var http = require('http');
var url = require('url');
var server = http.createServer(listener);
server.listen(8080);
console.log('Server start');
function listener(request, response) {
var urlInfo = url.parse(request.url);
var pathname = urlInfo.pathname;
if (pathname == '/') {
response.statusCode = 200;
response.setHeader('Content-type', 'text/plain');
response.write('Document root');
response.end();
}
else if (pathname == '/hello') {
response.statusCode = 200;
response.setHeader('Content-type', 'text/plain');
response.write('Hello, node.js');
response.end();
}
else {
response.statusCode = 404;
response.setHeader('Content-type', 'text/plain');
response.write('Not found');
response.end();
}
}
主要な点の解説は以下の通りです。
2行目
urlモジュールを読み込んで、変数urlに割り当てます。
9行目
リクエスト(1つ目のパラメータのrequest)のurlプロパティを、parseメソッドでパースして、結果をurlInfoに代入します。
10行目
urlInfoのpathnameプロパティ(アクセスされたアドレスのパスの部分)を、変数pathnameに代入します。
11~16行目
「/」にアクセスされたときに、「Document root」のレスポンスを返します。
17~22行目
「/hello」にアクセスされたときに、「Hello, node.js」のレスポンスを返します。
23~28行目
その他のアドレスにアクセスされたときに、「Not found」のレスポンスを返します。
なお、Not foundなので、ステータスコードを404にしています(24行目)。
