情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

httpモジュールによるHTTPサーバ(3)HTTPリクエストの内容の取得

この記事は「httpモジュールによるHTTPサーバ」という連載記事の3つ目の記事です。

その他の記事に関しては下を参照してください。

この記事ではhttpモジュールを使ってクライアントからのHTTPリクエストの内容の取得を行うHTTPサーバを作成する方法を説明します。

リクエストメソッド

req.methodにはHTTPリクエストメソッドが格納されています。

var http = require('http');

var server = http.createServer(function (req, res) {
    try {
        var method = req.method;
    }
    finally {
        res.end();
    }
});

なお、httpモジュールがサポートしている全てのリクエストメソッドはhttp.METHODSに配列として格納されています

リクエストURL

req.urlにはHTTPリクエストのURLのパス部分以降が格納されています。

var server = http.createServer(function (req, res) {
    try {
        var url = req.url;
    }
    finally {
        res.end();
    }
});

クエリ文字列

クエリ文字列はreq.urlに格納されているHTTPリクエストのURLのパス部分以降をurl.parse関数を使用してパースすることにより取得します。

var url = require('url');

var server = http.createServer(function (req, res) {
    try {
        var query = url.parse(req.url, true).query;
    }
    finally {
        res.end();
    }
});

リクエストヘッダ

req.headersにはHTTPリクエストヘッダがオブジェクトとして格納されています。オブジェクトのプロパティがヘッダのフィールドを表し、プロパティ名がフィールド名を表し、プロパティの値がフィールドの値を表します。ただし、フィールド名は小文字化されます

var server = http.createServer(function (req, res) {
    try {
        var headers = req.headers;
    }
    finally {
        res.end();
    }
});

なお、HTTPリクエストヘッダに同じフィールドが複数存在する場合にはフィールドに応じて下のようになります。

下のフィールドの場合、最初のフィールド以外の値が破棄されます。

  • age
  • authorization
  • content-length
  • content-type
  • etag
  • expires
  • from
  • host
  • if-modified-since
  • if-unmodified-since
  • last-modified
  • location
  • max-forwards
  • proxy-authorization
  • referer
  • retry-after
  • user-agent

set-cookieフィールドの場合、フィールドの値が統合されます。

その他のフィールドの場合、フィールドの値が,で結合されます。

サンプルコード1

クライアントからリクエストを受け取ったらクライアントからのHTTPリクエストの内容を標準出力に出力するHTTPサーバを作成し、起動します。

Enterキーが押されたらサーバを停止し、プログラムを終了します。

http-server-request.js

var http = require('http');
var url = require('url');

var server = http.createServer(function (req, res) {
    try {
        console.log('requested.');
        console.log('method: ' + req.method);
        console.log('url: ' + req.url);
        console.log('query: %j', url.parse(req.url, true).query);
        console.log('user agent: ' + req.headers['user-agent']);
    }
    catch (err) {
        console.error('unhandled exception has occured.');
        console.error(err);
    }
    finally {
        res.end();
    }
});
server.listen(3000, function () {
    console.log('http server is running...press enter key to exit.');

    process.stdin.on('data', function (data) {
        if (data.indexOf('\n') !== -1) {
            server.close(function () {
                console.log('http server closed.');
                process.exit(0);
            });
        }
    });
});
server.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

実行結果

実行結果の確認のためにcURLを使用しています。

コードを実行するとHTTPサーバが起動します。

C:\work\node>node http-server-request.js
http server is running...press enter key to exit.

cURLを使ってサーバに対して様々なHTTPリクエストを行います。

C:\work\node>curl -v http://localhost:3000/
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET / HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 29 Jul 2016 05:34:18 GMT
< Connection: keep-alive
< Content-Length: 0
<
* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/sasasa -X POST
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> POST /sasasa HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 29 Jul 2016 05:34:19 GMT
< Connection: keep-alive
< Content-Length: 0
<
* Connection #0 to host localhost left intact
C:\work\node>curl -v "http://localhost:3000/sasasa?foo=100&bar=200" -X PUT
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> PUT /sasasa?foo=100&bar=200 HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 29 Jul 2016 05:34:19 GMT
< Connection: keep-alive
< Content-Length: 0
<
* Connection #0 to host localhost left intact

HTTPリクエストの内容が正しく取得できていることが分かります。

C:\work\node>node http-server-request.js
http server is running...press enter key to exit.
requested.
method: GET
url: /
query: {}
user agent: curl/7.46.0
requested.
method: POST
url: /sasasa
query: {}
user agent: curl/7.46.0
requested.
method: PUT
url: /sasasa?foo=100&bar=200
query: {"foo":"100","bar":"200"}
user agent: curl/7.46.0

Enterキーを押すとサーバが停止し、プログラムが終了します。

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js