Ainsi, 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 ? Il est clair que l'on peut définir les en-têtes et indiquer que le type de contenu de la réponse sera "application/json" ;, mais il y a ensuite différentes façons d'écrire/envoyer l'objet. Celle que j'ai vue couramment utilisée est 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);
Cela semble envoyer un objet JSON basé sur la sortie de curl, comme dans le 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. Donc, comment peut-on réellement é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 aussi une chaîne de caractères, si vous voulez envoyer la réponse préttifiée, pour une raison maladroite, vous pouvez utiliser quelque chose comme JSON.stringify(anObject, null, 3)
.
Il est important que vous définissiez l'en-tête Content-Type
à application/json
, aussi.
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}
Joli :
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 voulez le terminer par une nouvelle ligne, mais vous pourriez simplement faire `JSON.stringify(...) + '\n'`` pour y parvenir.
Dans Express, vous pouvez faire cela en [modifiant les options à la place][1].
'json replacer'
La fonction de rappel de l'outil de remplacement JSON est nulle par défaut.
'json spaces'
Espaces de réponse JSON pour le formatage, 2 par défaut en développement, 0 en production.
Il n'est pas recommandé de fixer la valeur à 40.
app.set('json spaces', 40);
Vous pourriez alors répondre avec du json.
res.json({ a: 1 });
Il utilisera la configuration 'json spaces
' ; pour l'embellir.
Depuis Express.js 3x, l'objet réponse possède une méthode json() qui définit correctement tous les en-têtes pour vous et renvoie la réponse au format JSON.
Exemple :
res.json({"foo": "bar"});
Si vous essayez d'envoyer un fichier json, vous pouvez utiliser les flux.
var usersFilePath = path.join(__dirname, 'users.min.json');
apiRouter.get('/users', function(req, res){
var readable = fs.createReadStream(usersFilePath);
readable.pipe(res);
});