Réponses:
Le statut 422 semble le plus approprié en fonction de la spécification .
Le code d'état 422 (entité non traitable) signifie que le serveur comprend le type de contenu de l'entité de demande (donc un code d'état 415 (type de support non pris en charge) est inapproprié), et la syntaxe de l'entité de demande est correcte (donc 400 (mauvaise demande) ) le code d'état est inapproprié) mais n'a pas pu traiter les instructions contenues. Par exemple, cette condition d'erreur peut se produire si un corps de requête XML contient des instructions XML bien formées (c'est-à-dire syntaxiquement correctes) mais sémantiquement erronées.
Ils déclarent que le XML mal formé est un exemple de mauvaise syntaxe (appelant un 400). Une chaîne de requête mal formée semble analogue à cela, donc 400 ne semble pas approprié pour une chaîne de requête bien formée à laquelle il manque un paramètre.
UPDATE @DavidV souligne correctement que cette spécification est pour WebDAV, pas pour le noyau HTTP. Mais certaines API non WebDAV populaires utilisent de toute façon 422, faute d'un meilleur code d'état ( voir ceci ).
400
c'est plus approprié.
Je ne suis pas sûr qu'il existe une norme définie, mais j'aurais utilisé 400 Bad Request , que la dernière spécification HTTP (de 2014) documente comme suit :
6.5.1. 400 Mauvaise demandeLe code d'état 400 (Bad Request) indique que le serveur ne peut pas ou ne traitera pas la demande en raison de quelque chose qui est perçu comme une erreur client (par exemple, une syntaxe de demande incorrecte, un cadrage de message de demande invalide ou un routage de demande trompeur).
400 Bad Request
est destiné à indiquer des problèmes au niveau du protocole, pas des erreurs sémantiques. Si nous allons détourner les codes d'état HTTP pour indiquer des erreurs au niveau de l'application (plutôt qu'au niveau du protocole), pourquoi ne pas aller jusqu'au bout et simplement utiliser 412
?
L' API WCF dans .NET gère les paramètres manquants en renvoyant une HTTP 404
erreur «Endpoint Not Found», lors de l'utilisation de webHttpBinding .
Cela 404 Not Found
peut avoir un sens si vous considérez le nom de votre méthode de service Web avec sa signature de paramètre. Autrement dit, si vous exposez une méthode de service Web LoginUser(string, string)
et que vous en faites la demande LoginUser(string)
, cette dernière n'est pas trouvée.
Fondamentalement, cela signifie que la méthode de service Web que vous appelez, ainsi que la signature de paramètre que vous avez spécifiée, est introuvable.
10.4.5 404 introuvable
Le serveur n'a rien trouvé correspondant à l'URI de la demande. Aucune indication n'est donnée quant à savoir si la condition est temporaire ou permanente.
Le 400 Bad Request
, comme l'a suggéré Gert , reste un code de réponse valide, mais je pense qu'il est normalement utilisé pour indiquer des problèmes de niveau inférieur. Elle pourrait facilement être interprétée comme une requête HTTP mal formée, peut-être des en-têtes HTTP manquants ou invalides, ou similaire.
10.4.1 400 Mauvaise requête
La demande n'a pas pu être comprise par le serveur en raison d'une syntaxe incorrecte. Le client NE DEVRAIT PAS répéter la demande sans modifications.
Vous pouvez envoyer un code 400 Bad Request. C'est l'un des codes d'état 4xx à usage plus général, vous pouvez donc l'utiliser pour signifier ce que vous voulez: le client envoie une demande qui manque les informations / paramètres dont votre application a besoin pour la traiter correctement.
Dans l'un de nos projets API, nous décidons de définir un statut 409 pour une demande, lorsque nous ne pouvons pas le remplir à 100% en raison d'un paramètre manquant.
Le code d'état HTTP "409 Conflict" a été pour nous un bon essai car sa définition nécessite d'inclure suffisamment d'informations pour que l'utilisateur reconnaisse la source du conflit.
Référence: w3.org/Protocols/
Ainsi, parmi d'autres réponses telles que 400 ou 404, nous avons choisi 409 pour imposer la nécessité de parcourir certaines notes de la demande, utiles pour configurer une nouvelle et correcte demande.
Quoi qu'il en soit, notre cas était particulier, car nous devons envoyer des données la veille si la demande n'était pas complètement correcte, et nous devons obliger le client à lire le message et à comprendre ce qui n'allait pas dans la demande.
En général, si nous n'avons que quelques paramètres manquants, nous optons pour un 400 et un tableau de paramètres manquants. Mais lorsque nous devons envoyer plus d'informations, comme un message de cas particulier et que nous voulons être plus sûrs que le client s'en occupera, nous envoyons un 409
J'utilise généralement 422 (entité non traitable) si quelque chose dans les paramètres requis ne correspond pas à ce que le point de terminaison API exigeait (comme un mot de passe trop court), mais pour un paramètre manquant, j'opterais pour 406 (inacceptable).
Accept-Language: de
, indiquant qu'il n'acceptera que les réponses en allemand, mais les seules versions du document demandé disponibles sur votre serveur sont en anglais ou en français.) L'utiliser pour indiquer un paramètre manquant dans la demande est incorrect, selon la définition dans spec.
Pour ceux qui sont intéressés, Spring MVC (3.x au moins) renvoie un 400 dans ce cas, ce qui me semble faux.
J'ai testé plusieurs URL Google (accounts.google.com) et supprimé les paramètres requis, et ils retournent généralement un 404 dans ce cas.
Je copierais Google.
On pourrait faire valoir que a 404 Not Found
devrait être utilisé car la ressource spécifiée est introuvable.
J'utilise souvent une erreur interdite 403. Le raisonnement est que la demande a été comprise, mais je ne vais pas faire comme demandé (parce que les choses vont mal). L'entité de réponse explique ce qui ne va pas, donc si la réponse est une page HTML, les messages d'erreur sont dans la page. S'il s'agit d'une réponse JSON ou XML, les informations d'erreur s'y trouvent.
De rfc2616 :
10.4.4 403 Interdit
Le serveur a compris la demande, mais refuse de la satisfaire.
L'autorisation n'aidera pas et la demande NE DEVRAIT PAS être répétée.
Si la méthode de demande n'était pas HEAD et que le serveur souhaite rendre
public pourquoi la demande n'a pas été satisfaite, il DEVRAIT décrire la raison du refus dans l'entité. Si le serveur ne souhaite pas mettre ces informations à la disposition du client, le code d'état 404
(Not Found) peut être utilisé à la place.
Authorization will not help
, donc Twitter ne devrait pas envoyer cela pour les informations d'identification OAuth non valides.
401 Unauthorized
. Cependant, vous pouvez comprendre pourquoi ils ne le font pas si vous regardez les descriptions des documents MDN de ces deux codes, qui sont très similaires.
Juste pour utiliser ASP.NET Core comme référence ou exemple, ASP.NET Core vous permet d'échafauder un contrôleur avec des actions, voici à quoi ressemble l'action "Détails".
// GET: Cars/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
if (car == null)
{
return NotFound();
}
return View(car);
}
Si le paramètre id
n'est pas défini, il renvoie 404 Not Found.
Renvoyer un 404 - ce qui signifie que la ressource est introuvable.
Essayez de modifier l'URL d'un site contenant un identifiant. J'en ai essayé quelques-uns:
Tous renvoient 404, imo parce que ces développeurs interprètent correctement la norme, ce que la réponse ici et beaucoup d'autres ne sont pas!
requestBody
.
J'irais avec un 403.
De RFC 2616 - Hypertext Transfer Protocol - HTTP / 1.1
403 Interdit
Le serveur a compris la demande, mais refuse de la satisfaire. L'autorisation n'aidera pas et la demande NE DEVRAIT PAS être répétée. Si la méthode de demande n'était pas HEAD et que le serveur souhaite rendre public pourquoi la demande n'a pas été satisfaite, il DEVRAIT décrire la raison du refus dans l'entité. Si le serveur ne souhaite pas mettre ces informations à la disposition du client, le code d'état 404 (Not Found) peut être utilisé à la place.
Vous devez décrire la raison de l'échec dans votre réponse. Si vous préférez ne pas le faire, utilisez simplement le 404.