レスポンスを処理する
HTTPサーバのレスポンスを返すには、http.ServerResponseオブジェクトを操作します。http.ServerResponseオブジェクトは、requestイベントの第2引数として渡されます。リスト2は、レスポンス処理の抜粋です。
var listener = function(request, response) {
// URLの振り分け
if(request.url == '/') {
//(1)レスポンスヘッダの送信
response.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'});
//(2)レスポンスボディの送信
response.write('Hello World\n');
response.write('こんにちは世界\n');
//(3)レスポンス処理の完了
response.end();
} else {
//(4)エラーページの表示
response.writeHead(404, {'Content-Type': 'text/plain;charset=utf-8'});
response.end('ページが見つかりません。');
}
};
処理の流れを説明します。
(1)、(4)のwriteHeadメソッドはレスポンスヘッダを送信します。endメソッドが呼び出される前に1回だけ呼び出す必要があります。この例では、「'/'」にアクセスした場合は、「200 OK」を返却し、それ以外では「404 Not Found」を返しています。第2引数には返却するヘッダ情報を設定しています。
(2)writeメソッドは、レスポンスボディの送信を行います。複数回呼び出して構いません。
(3)、(4)のendメソッドは、レスポンス処理が完了したことをサーバに通知します。(3)のように引数なしで呼び出したり、(4)のように同時にレスポンスボディを付加することもできます。
他にもいくつかメソッドは存在しますが、今回紹介したものを下表にまとめました。
Internet Explorerの場合、リスト2のエラーページが正しく表示されない場合があります。これは、インターネットオプションの「エラーメッセージの簡易表示」がオンになっているためです。これををオフにするためには、[ツール]-[インターネットオプション]-[詳細設定]から該当設定をオフにしてください。
| メソッド名 | 概要 |
| writeHead(statusCode, [reasonPhrase], [headers]) | HTTPステータスstatusCode、レスポンスヘッダheadersを送信します。このメソッドは、endメソッドが呼び出される前に、1回だけ呼び出す必要があります。リスト2の例では、第2引数のreasonPhraseを省略し、headersを指定しています |
| write(chunk, [encoding]) | レスポンスボディchunkを送信します。複数回呼び出しても構いません(encodingのデフォルトはUTF-8) |
| end([chunk], [encoding]) | レスポンスのヘッダとボディが送信完了したことをサーバに通知します。このメソッドを呼び出すことによってサーバ側のメッセージ処理は完了します(encodingのデフォルトはUTF-8) |
リクエストを処理する
クライアントからのリクエスト情報は、responseイベントの第1引数で渡されるhttp.ServerRequestオブジェクトを参照します。さまざまな情報が格納されますが、代表的なプロパティを下表にまとめました。
| プロパティ名 | 概要 |
| method | リクエストのメソッドを表す文字列。クライアントの要求によってGET/PUT/POST/DELETEなどの文字列が格納されます |
| url | リクエストURLを表す文字列 |
| headers | リクエストのヘッダー情報を表すオブジェクト |
| httpVersion | HTTPのプロトコルバージョンを表す文字列(例:1.1など) |
実際に確認するため、リクエスト情報を表示してみましょう(リスト3)。
// util モジュールの読み込み
var util = require('util');
...
var listener = function(request, response) {
// レスポンスプロパティの表示
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write(util.format('method : %s\n', request.method));
response.write(util.format('url : %s\n', request.url));
response.write(util.format('headers : %j\n', request.headers));
response.write(util.format('version : %s\n', request.httpVersion));
response.end();
};
リスト3を実行した結果です。プロパティに情報が格納されているかどうかが確認できます(リスト4)。
method : GET
url : /
headers : {"accept":"text/html, application/xhtml+xml, */*",
"accept-language":"ja-JP","user-agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
"accept-encoding":"gzip, deflate",
"host":"127.0.0.1:8124",
"connection":"Keep-Alive"}
version : 1.1
