Mettre détaillée de REPOS message d'erreur dans l'adresse HTTP en-tête Warning, bonne ou mauvaise idée?
Nous sommes de développement d'une norme de service de REPOS à l'aide de codes d'état HTTP, comme son code de réponse si quelque chose s'est mal passé. (par exemple, entrée utilisateur non valide serait de retour "400 Bad Request" pour le client)
Toutefois, nous avons estimé qu'un message d'erreur plus détaillé serait utile pour le client. (par exemple, l'entrée non valide erreur est due à X étant un nom de paramètre non reconnu)
Nous aimerions être aussi fidèle à l'adresse HTTP specs que possible, donc après l'étude de la spécification dans le RFC2616, nous envisageons de mettre le message d'erreur détaillé dans les en-Têtes HTTP, en particulier sur la L'en-tête HTTP de la zone d'alerte. Il a dit sur la RFC:
L'Avertissement général-champ d'en-tête est utilisé pour contenir des renseignements supplémentaires au sujet de l'état ou de la transformation d'un message qui pourrait ne pas être reflétés dans le message. Cette information est généralement utilisé pour avertir d'un éventuel manque de transparence sémantique à partir de la mise en cache des opérations ou transformations appliquées à l'entité corps du message.
Il semble y avoir aucune restriction sur l'utilisation de cet en-tête pour d'autres mises en garde (comme le RESTE de message d'erreur), même ceux qui sont sans rapport avec le cache avertissements que par l'intention originale de cet en-tête. Nous aimons la sémantique, et nous avons prévu d'utiliser l'299 avertissement de code, ce qui semble correspondre au projet de loi assez bien:
299 Divers persistante avertissement Le texte d'avertissement PEUVENT inclure arbitraire de l'information être présentés à un utilisateur humain, ou connecté. Un système de réception de cet avertissement NE DOIT prendre aucune des mesures automatisées.
Donc, compte tenu de l'entrée non valide erreur de cas présentées sur le haut de cette question, nous envisageons de mettre notre REPOS message d'erreur semblable à l'exemple suivant:
HTTP/1.1 400 Bad Request
Warning: 299 ServiceName "Invalid input error: X is unrecognized parameter name."
Est-ce une bonne idée ou pratique? Nous avons également constaté que certains services détaillée de ce message à X-Avertissement de la tête, mais ce ne semble pas être la norme. Nous sommes demandé ce qui serait la ruche sagesse de stackoverflow RESTE de la foule pensez à ce sujet. Est-il aussi mieux/une pratique courante pour la transmission des messages d'erreur dans le RESTE de réponses?
- Remarque: les Avertissements peuvent s'accumuler entre les différentes requêtes en cache/proxy environnements. Probablement pas un impact sur une dynamique de service de REPOS, mais quelque chose à garder à l'esprit.
- qu'avez-vous les gars faire à la fin?
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas simplement changer l'expression de motif? C'est ce qu'il est là pour ça. Le "Bad Request" texte est juste la valeur par défaut. Si vous souhaitez inclure plus d'informations, utilisez ensuite le corps de la réponse. La spécification HTTP, vous DEVEZ inclure un corps de réponse avec des détails d'une erreur.
Mise à JOUR
Basé sur les plus récentes sur la lecture de la RFC 7231 et de matériel connexe, il semble que la seule raison valable pour changer l'expression de motif est de localiser le texte, de ne pas donner un sens plus précis. Désolé à ce sujet.
NSHTTPURLResponse
n'est pas de tout souci.Où vous mettez vos commentaires, que ce soit dans le corps du message (contenu) ou dans un en-tête Warning, être prudent pour éviter de donner la moindre information qui pourrait être utile à un attaquant de faire des tests de pénétration sur votre système.
Parfois moins d'infos, c'est mieux.
Je suis en faveur de l'utilisation des en-têtes pour un avertissement uniquement lorsque la demande réussit en général.
Par exemple un service qui est un utilisateur de détails, mais certaines de ces informations proviennent d'une tierce partie qui revient souvent. Dans notre cas, il était préférable de laisser cette section de l'utilisateur de données vide, mais afficher un avertissement à l'utilisateur que certaines données sont manquantes.
Si la requête retourne un 200 Succès, avec une charge utile qui contenait tout ce que nous pouvions récupérer, mais avait ensuite avertissement en-têtes qui décrit l'erreur pour le reste.
Je suis en faveur de l'approche générale. Nous devons supposer que le développeur client est dans une autre équipe du service de développeur, peut-être dans un autre fuseau horaire, etc. Peut-être même d'une société différente. C'est pas bon juste retour d'un "non c'est un bad request" réponse, comment le client peut-il résoudre le problème.
Si philosophiquement: dire les clients sur les choses qu'ils ont une responsabilité à corriger. Les erreurs qui sont purement de la portée du serveur (par exemple. connexion de base de données d'erreur, ou de certains problème de logique) c'est juste pour retourner une erreur 500. Et ici, je ne voudrais pas envoyer de détail, nous ne voulons pas exposer les détails de notre la mise en œuvre interne pour le client.
Jusqu'à maintenant j'ai été renvoyer des données dans le corps de la réponse, à l'aide de JAX/RS:
Je pense que votre utilisation des en-têtes peuvent être en fait un nettoyant appraoch.
Si cette proposition est accepté, il présente une alternative à l'envoi de détail des messages d'erreur. [http://tools.ietf.org/html/draft-nottingham-http-browser-hints]
Malgré qu'il soit un I-D, il est assez stable ces derniers temps, et je ne vois pas de problème avec la construction de votre propre mise en œuvre. (Je l'ai fait.)
429 Trop de Demandes (RFC 6585)
L'utilisateur a envoyé un trop grand nombre de demandes dans un laps de temps donné. Conçu pour une utilisation avec une limitation du taux de régimes.
Depuis, vous permettant à une demande par la durée de vie, vous êtes à la mise en œuvre d'un taux de limitation de régime, de sorte que c'est la appropriée de la réponse HTTP.
Vous pouvez également (et sont encouragés par la spécification HTTP) pour personnaliser le corps de la Réponse HTTP, de sorte que vous pouvez changer "Trop de Demandes" à n'importe quelle explication vous voulez.