Prawidłowy sposób zwracania JSON za pomocą node lub Express
Można więc spróbować pobrać następujący obiekt 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"
}
$
Czy istnieje sposób na wytworzenie dokładnie tego samego ciała w odpowiedzi z serwera za pomocą node lub express? Oczywiście można ustawić nagłówki i wskazać, że content-type odpowiedzi będzie "application / json" , ale wtedy są różne sposoby zapisu / wysłania obiektu. Ten, który widziałem powszechnie używany jest za pomocą polecenia formularza:
response.write(JSON.stringify(anObject));
Ma to jednak dwa punkty, w których jeden można argumentować tak, jakby były "problemami":
- wysyłamy ciąg znaków.
- ponadto na końcu nie ma znaku nowej linii.
Innym pomysłem jest użycie polecenia:
response.send(anObject);
Wygląda na to, że wysyła obiekt JSON na podstawie wyjścia curl, podobnie jak w pierwszym przykładzie powyżej. Jednak nie ma nowego znaku linii na końcu ciała, gdy curl jest ponownie używany na terminalu. Jak więc można napisać coś takiego z znak nowej linii dodawany na końcu za pomocą node lub node / express?
5 answers
Ta odpowiedź też jest ciągiem znaków, jeśli chcesz wysłać odpowiedź z jakiegoś niezręcznego powodu, możesz użyć czegoś w rodzaju JSON.stringify(anObject, null, 3)
Ważne jest, aby ustawić nagłówek Content-Type
na 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}
Prettified:
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
// > }
Nie jestem do końca pewien, dlaczego chcesz zakończyć go nową linią, ale możesz po prostu zrobić JSON.stringify(...) + '\n'
, aby to osiągnąć.
Express
W Expressie możesz to zrobić poprzez zmianę opcji zamiast .
'json replacer'
JSON replacer callback, domyślnie null
'json spaces'
JSON response spaces for formating, defaults to 2 in development, 0 in production
nie zaleca się ustawiania na 40
app.set('json spaces', 40);
Wtedy mógłbyś po prostu odpowiedzieć jakimś jsonem.
res.json({ a: 1 });
Użyje konfiguracji 'json spaces
' do jej poprawienia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 17:46:41
Od Express.js 3x obiekt odpowiedzi posiada metodę json (), która poprawnie ustawia wszystkie nagłówki i zwraca odpowiedź w formacie JSON.
Przykład:
res.json({"foo": "bar"});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 12:17:52
Jeśli próbujesz wysłać plik json możesz użyć strumieni
var usersFilePath = path.join(__dirname, 'users.min.json');
apiRouter.get('/users', function(req, res){
var readable = fs.createReadStream(usersFilePath);
readable.pipe(res);
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 20:19:59
Można go po prostu ulepszyć za pomocą pipe i jednego z wielu procesorów. Twoja aplikacja powinna zawsze odpowiadać tak małym obciążeniem, jak to możliwe.
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-06 07:10:03
Możesz użyć oprogramowania pośredniczącego, aby ustawić domyślny typ zawartości i ustawić inny typ zawartości dla poszczególnych interfejsów API. Oto przykład:
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>`);
})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-22 16:20:51