そこで、次のようなJSONオブジェクトを取得しようとします。
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked
{
"anotherKey": "anotherValue",
"key": "value"
}
$
nodeやexpressを使ったサーバからのレスポンスで、まったく同じボディを生成する方法はありますか?ヘッダーを設定して、レスポンスのコンテントタイプが"application/json"であることを示すことはできますが、オブジェクトの書き込み/送信方法はさまざまです。私がよく目にするのは、次のような形式のコマンドを使用する方法です。
response.write(JSON.stringify(anObject));
しかし、これには2つの問題点があると考えられます。
もうひとつのアイデアは、コマンドを使うことです。
response.send(anObject);
これは、上記の最初の例と同様に、curl の出力に基づいて JSON オブジェクトを送信しているように見えます。しかし、curlが再びターミナルで使用されている場合、ボディの最後に改行文字がありません。では、実際にnodeやnode/expressを使って、このように末尾に改行文字を入れて書き出すにはどうすればよいのでしょうか?
このレスポンスも文字列ですが、もし何らかの理由でレスポンスを整形して送信したい場合は、JSON.stringify(anObject, null, 3)
のような方法があります。
また、Content-Type
ヘッダーをapplication/json
に設定することも重要です。
var http = require('http');
var app = http.createServer(function(req,res){
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);
// > {"a":1}
Prettified:
var http = require('http');
var app = http.createServer(function(req,res){
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);
// > {
// > "a": 1
// > }
なぜ改行で終わらせたいのかはよくわかりませんが、JSON.stringify(...) + 'in'
とすることで実現できます。
Expressでは、オプションを代わりに変更することで実現できます。
'json replacer'
JSONリプレーサーのコールバック、デフォルトではNULL
'json spaces'
フォーマット用のJSONレスポンススペース、デフォルトは開発時は2、運用時は0です。
実際には40に設定することは推奨されません。
app.set('json spaces', 40);
その後、いくつかのjsonで応答すればよい。
res.json({ a: 1 });
これは'json spaces
'という設定を使ってきれいにしてくれます。