Таким образом, можно попытаться получить следующий объект 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?
Этот ответ тоже является строкой, если вы хотите отправить ответ с предварительной сортировкой по какой-то неудобной причине, вы можете использовать что-то вроде 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}
Приукрашено:
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(...) + '\n'
для достижения этого.
В express вы можете сделать это, изменив вместо этого опции.
'json replacer'
обратный вызов JSON replacer, по умолчанию null
'json spaces'
JSON response spaces для форматирования, по умолчанию 2 в разработке, 0 в production
Не рекомендуется устанавливать значение 40
app.set('json spaces', 40);
Тогда вы можете просто ответить некоторым json.
res.json({ a: 1 });
Он будет использовать конфигурацию 'json spaces
', чтобы приукрасить его.
С Express.js 3x объект response имеет метод json(), который правильно устанавливает все заголовки для вас и возвращает ответ в формате JSON.
Пример:
res.json({"foo": "bar"});
Если вы пытаетесь отправить json-файл, вы можете использовать потоки
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
Вы можете использовать специальное программное обеспечение, чтобы установить тип содержимого по умолчанию, и установить тип содержимого по-разному для конкретных интерфейсов. Вот пример:
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>`);
})
В "РЭС".в JSON()` функция должно быть достаточно для большинства случаев.
приложение.вам('/', (req, действительно) => РЭС.в JSON({ ответ: 42 }));
В "РЭС".функции JSON()преобразует параметр передать в JSON используя [
формат JSON.преобразовать в строки()][2] и [устанавливает
контент-тип заголовка] [3] в
приложение/JSON; кодировка=кодировка UTF-8` поэтому клиенты http знать, чтобы автоматически обработать ответ.
Старая версия приложения Экспресс использования.использовать(экспресс.формат JSON())или
bodyParser.в JSON()` подробнее о bodyParser промежуточного
На последнюю версию экспресс можно просто использовать "РЭС".формат JSON()`
const express = require('express'),
port = process.env.port || 3000,
app = express()
app.get('/', (req, res) => res.json({key: "value"}))
app.listen(port, () => console.log(`Server start at ${port}`))
Для заголовка вопроса, я'м собираюсь дать кричать, чтобы "РЭС".типа здесь:
res.type('json')
эквивалентно
res.setHeader('Content-Type', 'application/json')
Источник: экспресс документы:
задает тип содержимого HTTP-заголовка для типа MIME, как определено для MIME.функция lookup() для указанного типа. Если тип содержит символ“/”, то он устанавливает контент-типа.