Je joue avec Nodejs et exprime en construisant une petite API de repos. Ma question est la suivante: quelle est la bonne pratique/la meilleure façon de définir le statut du code, ainsi que les données de réponse?
Laissez-moi vous expliquer avec un peu de code (je ne vais pas mettre le nœud et exprimer le code nécessaire pour démarrer le serveur, juste les méthodes de routeur qui sont concernées):
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
res.json(user);
});
exports.getUserById = function(id) {
for (var i = 0; i < users.length; i++) {
if (users[i].id == id) return users[i];
}
};
Le code ci-dessous fonctionne parfaitement et lors de l'envoi d'une requête avec Postman, j'obtiens le résultat suivant:
Comme vous pouvez le constater, le statut indique 200, ce qui est OK. Mais est-ce la meilleure façon de faire cela? Existe-t-il un cas où je devrais définir le statut moi-même, ainsi que le code JSON renvoyé? Ou est-ce toujours traité par exprès?
Par exemple, je viens de faire un test rapide et légèrement modifié la méthode get ci-dessus:
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
if (user == null || user == 'undefined') {
res.status(404);
}
res.json(user);
});
Comme vous pouvez le constater, si l'utilisateur ne figure pas dans le tableau, je définirai simplement un statut de 404.
Des ressources/conseils pour en savoir plus sur ce sujet sont les bienvenus.
Vous pouvez le faire de cette façon:
res.status(400).json(json_response);
Cela définira le code de statut HTTP sur 400, cela fonctionnera même dans express 4.
le statut 200 sera la valeur par défaut lors de l'utilisation de res.send
, res.json
, etc.
Vous pouvez définir le statut comme res.status(500).json({ error: 'something is wrong' });
Souvent, je fais quelque chose comme ...
router.get('/something', function(req, res, next) {
// Some stuff here
if(err) {
res.status(500);
return next(err);
}
// More stuff here
});
Ensuite, mon middleware d'erreur envoie la réponse et faites tout ce que je dois faire en cas d'erreur.
De plus: res.sendStatus(status)
a été ajouté à partir de la version 4.9.0http://expressjs.com/4x/api.html#res.sendStatus
Une liste de Codes de statut HTTP
La bonne pratique en matière de réponse d'état consiste à envoyer, de manière prévisible, le code d'état HTTP approprié en fonction de l'erreur (4xx pour les erreurs client, 5xx pour les erreurs serveur), en ce qui concerne la réponse JSON réelle, il n'y a pas de "bible" mais une bonne idée pourrait être pour envoyer (à nouveau) le statut et les données sous forme de 2 propriétés différentes de l'objet racine dans une réponse réussie (de cette manière, vous donnez au client la possibilité de capturer le statut à partir des en-têtes HTTP et le contenu lui-même) et une 3ème propriété expliquant l'erreur d'une manière compréhensible pour l'homme dans le cas d'une erreur.
Stripe's API se comporte de la même manière dans le monde réel.
c'est à dire.
D'ACCORD
200, {status: 200, data: [...]}
Erreur
400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
J'utilise ceci dans mon application Express.js:
app.get('/', function (req, res) {
res.status(200).json({
message: 'Welcome to the project-name api'
});
});
res.status(500).jsonp(dataRes);
try {
var data = {foo: "bar"};
res.json(JSON.stringify(data));
}
catch (e) {
res.status(500).json(JSON.stringify(e));
}
La méthode standard pour obtenir une réponse HttpResponse complète incluant les propriétés suivantes
Sur le backend, faites ceci
router.post('/signup', (req, res, next) => {
// res object have its own statusMessage property so utilize this
res.statusMessage = 'Your have signed-up succesfully'
return res.status(200).send('You are doing a great job')
})
si vous souhaitez recevoir, c'est-à-dire dans l'application Angular
, procédez comme suit:
this.http.post(`${this.domain}/signup`, { profile: data }, {
observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
console.log(response)
})