情報アイランド

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

expressモジュールによるHTTPサーバ(11)JSON/JSONPの送信

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

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

また、HTTP自体について知りたい方は下を参照してください。

この記事ではexpressモジュールを使ってHTTPリクエストに対してJSONやJSONPの送信を行うHTTPサーバを作成する方法について説明します。

JSONの送信

HTTPレスポンスボディにJSONを設定してレスポンスの送信を行うにはres.json関数を使用します。

var express = require('express');

var app = express();
app.use(function (req, res, next) {
    res.json({ xxx: 'xxx', yyy: 'yyy' });
});

第1引数にオブジェクトを指定します。

このオブジェクトがJSON.stringify関数を使用して文字列に変換され、JSONとして送信されます。

なお、HTTPレスポンスのContent-Typeヘッダフィールドには自動的にapplication/json; charset=utf-8が設定されます。

JSONに関する設定項目

JSONに関するアプリケーションの設定項目として下の2つがあります。

  • json replacer・・・JSON.stringify関数の第2引数として使用する値を設定します。
  • json spaces・・・JSON.stringify関数の第3引数として使用する値を設定します。

JSONPの送信

HTTPレスポンスボディにJSONPを設定してレスポンスの送信を行うにはres.jsonp関数を使用します。

app.use(function (req, res, next) {
    res.jsonp({ xxx: 'xxx', yyy: 'yyy' });
});

第1引数にオブジェクトを指定します。

このオブジェクトがJSON.stringify関数を使用して文字列に変換され、JSONPとして送信されます。

すなわち、/**/ typeof foo === 'function' && foo({"xxx":"xxx","yyy":"yyy"});のような文字列が送信されます。

ただし、HTTPリクエストのクエリパラメータにJSONPのコールバック関数の名称が指定されていない場合にはJSONとして送信されますので注意してください。

なお、HTTPレスポンスのContent-Typeヘッダフィールドには自動的にtext/javascript; charset=utf-8が設定されます。

JSONPに関する設定項目

JSONPに関するアプリケーションの設定項目としてjsonp callback name設定項目があります。

これはJSONPのコールバック関数の名称を指定するクエリパラメータのキーを設定するためのものであり、デフォルトはcallbackです。

サンプルコード1

クライアントからリクエストを受け取ったらURLに応じてJSONやJSONPを返すHTTPサーバを作成し、起動します。

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

express-server-json.js

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

var app = express();
app.set('env', 'development');
app.set('x-powered-by', false);
app.set('case sensitive routing', true);
app.set('strict routing', true);
app.set('jsonp callback name', 'cb');
app.get('/json', function (req, res, next) {
    res.json({ name: 'pizyumi', age: 26 });
});
app.get('/jsonp', function (req, res, next) {
    res.jsonp({ name: 'pizyumi', age: 26 });
});
app.get('*', function (req, res, next) {
    res.status(404);
    res.type('text/plain; charset=utf-8');
    res.send(http.STATUS_CODES[404] + '\r\n');
});
app.all('*', function (req, res, next) {
    res.status(501);
    res.type('text/plain; charset=utf-8');
    res.send(http.STATUS_CODES[501] + '\r\n');
});
var server = app.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);
});

使用パッケージ

  • express
    npm install expressでインストールします。

実行結果

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

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

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

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

C:\work\node>curl -v http://localhost:3000/json
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /json HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Content-Length: 27
< ETag: W/"1b-Iau5O3VklxY2o2dZaqdEXg"
< Date: Thu, 29 Sep 2016 00:03:13 GMT
< Connection: keep-alive
<
{"name":"pizyumi","age":26}* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/jsonp?cb=foo
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /jsonp?cb=foo HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Content-Type-Options: nosniff
< Content-Type: text/javascript; charset=utf-8
< Content-Length: 67
< ETag: W/"43-GAtWolHJn2nTUEF9HnuZIw"
< Date: Thu, 29 Sep 2016 00:03:16 GMT
< Connection: keep-alive
<
/**/ typeof foo === 'function' && foo({"name":"pizyumi","age":26});* Connection #0 to host localhost left intact

サーバから正しくレスポンスが返っていることが分かります。

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

関連

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

-express, Node.js