Правильный способ возврата JSON с помощью node или Express
таким образом, можно попытаться получить следующий объект 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));
, это два момента, когда можно спорить, как если бы это были "проблемы":
- мы посылаем строку.
- кроме того, в конце нет нового символа строки.
еще одна идея-использовать команду:
response.send(anObject);
похоже, что это отправка объекта JSON на основе вывода curl, аналогичного первому примеру выше. Однако в конце тела нет нового символа строки, когда curl снова используется на терминале. Итак, как можно на самом деле записывают что-то вроде этого с новым символом строки, добавленным в конце, используя node или node/express?
5 ответов
этот ответ тоже строку, если вы хотите отправить ответ приукрашивали, по непонятным мне причинам, вы могли бы использовать что-то вроде 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.send(JSON.stringify({ a: 1 }));
});
app.listen(3000);
// > {"a":1}
приукрашивали:
var http = require('http');
var app = http.createServer(function(req,res){
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);
// > {
// > "a": 1
// > }
Я не совсем уверен, почему вы хотите завершить его с новой строкой, но вы можете просто сделать JSON.stringify(...) + '\n'
для достижения этой цели.
Экспресс
в Express вы можете сделать это изменение параметров вместо.
'json replacer'
обратный вызов заменителя JSON, null по умолчанию
'json spaces'
пространства ответов JSON для форматирования, по умолчанию 2 в разработке, 0 в производстве
на самом деле не рекомендуется устанавливать 40
app.set('json spaces', 40);
тогда вы можете просто ответить некоторым json.
res.json({ a: 1 });
он будет использовать 'json spaces
' конфигурация, чтобы украсить его.
С Express.JS 3x объект response имеет метод json (), который правильно устанавливает все заголовки для вас и возвращает ответ в формате JSON.
пример:
res.json({"foo": "bar"});
Если вы пытаетесь отправить файл json, вы можете использовать streams
var usersFilePath = path.join(__dirname, 'users.min.json');
apiRouter.get('/users', function(req, res){
var readable = fs.createReadStream(usersFilePath);
readable.pipe(res);
});
вы можете просто украсить его с помощью трубы и одного из многих процессоров. Ваше приложение всегда должно отвечать с как можно меньшей нагрузкой.
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print
вы можете использовать промежуточное ПО для установки типа контента по умолчанию и задать тип контента по-разному для определенных API. Вот пример:
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
const server = app.listen(port);
server.timeout = 1000 * 60 * 10; // 10 minutes
// Use middleware to set the default Content-Type
app.use(function (req, res, next) {
res.header('Content-Type', 'application/json');
next();
});
app.get('/api/endpoint1', (req, res) => {
res.send(JSON.stringify({value: 1}));
})
app.get('/api/endpoint2', (req, res) => {
// Set Content-Type differently for this particular API
res.set({'Content-Type': 'application/xml'});
res.send(`<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>`);
})