J'ai une demande JSON que je poste sur une URL HTTP.
Doit-il être traité comme 400
où le requestedResource
champ existe mais "Roman"
est une valeur non valide pour ce champ?
[{requestedResource:"Roman"}]
Cela devrait-il être traité comme 400
où le "blah"
champ n'existe pas du tout?
[{blah:"Roman"}]
Roman
, ils ont juste besoin de vous payer plus :)Réponses:
Un 400 signifie que la demande a été mal formée. En d'autres termes, le flux de données envoyé par le client au serveur n'a pas suivi les règles.
Dans le cas d'une API REST avec une charge utile JSON, 400 sont généralement, et je dirais correctement, utilisés pour indiquer que le JSON n'est pas valide d'une manière ou d'une autre selon les spécifications de l'API pour le service.
Selon cette logique, les deux scénarios que vous avez fournis devraient être de 400.
Imaginez plutôt qu'il s'agissait de XML plutôt que de JSON. Dans les deux cas, le XML ne passerait jamais la validation du schéma - soit à cause d'un élément non défini ou d'une valeur d'élément incorrecte. Ce serait une mauvaise demande. Même affaire ici.
la source
Depuis w3.org
la source
La sélection d'un code de réponse HTTP est une tâche assez simple et peut être décrite par des règles simples. La seule partie délicate qui est souvent oubliée est le paragraphe 6.5 de la RFC 7231:
Les règles sont les suivantes:
Donc, dans votre cas, j'ai renvoyé 400 erreurs et quelque chose comme ça si "Roman" est obtenu à partir de l'entrée utilisateur et le client doit avoir une réaction spécifique:
ou une erreur plus générique, si une telle situation est une mauvaise erreur logique dans un client et n'est pas attendue, sauf si le développeur a fait quelque chose de mal:
la source
Dans aucun des cas, la "syntaxe n'est mal formée". Ce sont les sémantiques qui ont tort. Par conséquent, à mon humble avis, un 400 est inapproprié. Au lieu de cela, il serait approprié de renvoyer un 200 avec une sorte d'objet d'erreur tel que
{ "error": { "message": "Unknown request keyword" } }
ou autre.Considérez le (s) chemin (s) de traitement client. Une erreur de syntaxe (par exemple, un JSON invalide) est une erreur dans la logique du programme, en d'autres termes un bug quelconque, et doit être traitée en conséquence, d'une manière similaire à un 403, par exemple; en d'autres termes, quelque chose de mal a mal tourné.
Une erreur dans une valeur de paramètre, d'autre part, est une erreur de sémantique, peut-être due à une entrée utilisateur mal validée. Ce n'est pas une erreur HTTP (bien que je suppose que ce pourrait être un 422). Le chemin de traitement serait différent.
Par exemple, dans jQuery, je préférerais ne pas avoir à écrire un seul gestionnaire d'erreur qui traite à la fois des choses comme 500 et d'une erreur sémantique spécifique à l'application. D'autres frameworks, Ember pour un, traitent également les erreurs HTTP comme les 400 et 500 comme de grosses défaillances, obligeant le programmeur à détecter ce qui se passe et à se ramifier selon qu'il s'agit d'une "vraie" erreur ou non.
la source
Utiliser des
400
codes d'état à d'autres fins que d'indiquer que la demande est mal formée est tout simplement faux.Si la charge utile de la demande contient une séquence d'octets qui n'a pas pu être analysée comme
application/json
(si le serveur attend ce format de données), le code d'état approprié est415
:Si la charge utile de la demande est syntaxiquement correcte mais sémantiquement incorrecte, le
422
code de réponse non standard peut être utilisé ou le403
code d'état standard :la source
image/gif
au lieu d'êtretext/json
dans l'en-Content-Type:
tête. - vraisemblablement, cela s'applique également si un composant d'un multipartie a le mauvais type spécifié, voir tools.ietf.org/html/rfc4918 où il discute 422 pour plus de discussion,Pensez aux attentes.
En tant qu'application cliente, vous vous attendez à savoir si quelque chose ne va pas du côté serveur. Si le serveur doit renvoyer une erreur lorsqu'il
blah
est manquant ou si larequestedResource
valeur est incorrecte, une erreur 400 serait appropriée.la source
En complément, pour ceux qui pourraient rencontrer le même problème que le mien, j'utilise
$.ajax
pour publier des données de formulaire sur le serveur et j'ai également eu l'400
erreur au début.Supposons que j'ai une variable javascript,
N'utilisez pas de variable
formData
directement comme valeur de clédata
comme ci-dessous:Utilisez plutôt JSON.stringify pour encapsuler les éléments
formData
ci-dessous:Quoi qu'il en soit, comme d'autres l'ont illustré, l'erreur est due au fait que le serveur n'a pas pu reconnaître la requête provoquant une syntaxe mal formée, je soulève simplement une instance à l'entraînement. J'espère que cela serait utile à quelqu'un.
la source
Vérifiez d'abord l'URL, elle peut être erronée, si elle est correcte, vérifiez le corps de la demande que vous envoyez, la cause possible est que la demande que vous envoyez manque la syntaxe correcte.
Pour élaborer, recherchez les caractères spéciaux dans la chaîne de requête. S'il est (caractère spécial) utilisé, c'est la cause principale de cette erreur.
essayez de copier la demande et d'analyser chaque donnée de balise.
la source