Donc, on peut essayer de récupérer l'objet JSON suivant:
$ 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"
}
$
Existe-t-il un moyen de produire exactement le même corps dans une réponse d'un serveur utilisant node ou express? Clairement, on peut définir les en-têtes et indiquer que le type de contenu de la réponse va être "application/json", mais il existe alors différentes manières d'écrire/d'envoyer l'objet. Celui que j'ai vu couramment utilisé est en utilisant une commande de la forme:
response.write(JSON.stringify(anObject));
Cependant, il y a deux points sur lesquels on pourrait argumenter comme s'il s'agissait de "problèmes":
Une autre idée est d'utiliser la commande:
response.send(anObject);
Ceci semble envoyer un objet JSON basé sur la sortie de curl similaire au premier exemple ci-dessus. Cependant, il n'y a pas de caractère de nouvelle ligne à la fin du corps lorsque curl est à nouveau utilisé sur un terminal. Alors, comment peut-on écrire quelque chose comme ceci avec un caractère de nouvelle ligne ajouté à la fin en utilisant node ou node/express?
Cette réponse est également une chaîne. Si vous voulez envoyer la réponse en joliment affinée, pour une raison quelconque, vous pouvez utiliser quelque chose comme JSON.stringify(anObject, null, 3)
.
Il est également important de définir l'en-tête Content-Type
sur 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}
Prettifié:
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
// > }
Je ne sais pas exactement pourquoi vous souhaitez y mettre fin avec une nouvelle ligne, mais vous pouvez simplement faire JSON.stringify(...) + '\n'
pour y parvenir.
En express, vous pouvez le faire en en modifiant les options à la place } _.
'json replacer'
rappel du remplaçant JSON, null par défaut
'json spaces'
espaces de réponse JSON pour le formatage, la valeur par défaut est 2 en développement, 0 en production
Pas vraiment recommandé de régler à 40
app.set('json spaces', 40);
Ensuite, vous pouvez simplement répondre avec un json.
res.json({ a: 1 });
Il utilisera la configuration 'json spaces
'pour le rendre plus beau.
Depuis Express.js 3x, l’objet de réponse a une méthode json () qui définit correctement tous les en-têtes et renvoie la réponse au format JSON.
Exemple:
res.json({"foo": "bar"});
Si vous essayez d'envoyer un fichier JSON, vous pouvez utiliser des flux
var usersFilePath = path.join(__dirname, 'users.min.json');
apiRouter.get('/users', function(req, res){
var readable = fs.createReadStream(usersFilePath);
readable.pipe(res);
});
Vous pouvez simplement le rendre beau en utilisant un tuyau et un processeur. Votre application doit toujours répondre avec une charge aussi faible que possible.
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print
Vous pouvez utiliser un middleware pour définir le type de contenu par défaut et définir différemment le type de contenu pour des API particulières. Voici un exemple:
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>`);
})
si vous utilisez Express, vous pouvez utiliser ceci:
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));
ou juste ça
res.json({key:"value"});
Ancienne version d'Express use app.use(express.json())
ou bodyParser.json()
pour en savoir plus sur le middleware bodyParser
Sur la dernière version d’express, nous pourrions simplement utiliser res.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}`))