レスポンスを処理する
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