Java a-t-il une énumération complète pour les codes de réponse HTTP?

267

Je me demande s'il existe un type enum dans une bibliothèque de classes Java standard qui définit des constantes symboliques pour tous les codes de réponse HTTP valides. Il doit prendre en charge la conversion vers / à partir des valeurs entières correspondantes.

Je débogue du code Java qui utilise javax.ws.rs.core.Response.Status. Cela fonctionne, mais il ne définit qu'environ la moitié des codes de réponse HTTP valides.

Zoltan Szilagyi
la source

Réponses:

280

Je ne pense pas qu'il y en ait un qui soit complet dans les classes Java standard; HttpURLConnectionmanque pas mal de codes, comme HTTP 100/Continue.

Il y a cependant une liste complète dans les composants Apache HttpComponents:
org.apache.http.HttpStatus(remplacé org.apache.commons.HttpClient.HttpStatusdepuis Apache Http Client, qui a atteint la fin de sa vie )

John Feminella
la source
5
Il n'y a pas de "liste complète", car les codes d'état peuvent être étendus.
Julian Reschke
16
@JulianReschke Je pense que "complet" ici doit être interprété comme signifiant "conforme à tous les codes définis par la norme".
John Feminella
2
John: "la norme" ne définit pas "tous" les codes d'état. C'est pourquoi il existe un registre.
Julian Reschke
1
iana.org/assignments/http-status-codes/http-status-codes.xml ont une grande liste incluant le code = 100
Garis M Suero
1
@Donal: encore une fois, pas une bonne liste. Ce qui est pertinent, c'est le registre IANA.
Julian Reschke
66

L'interface javax.servlet.http.HttpServletResponsede l'API servlet a tous les codes de réponse sous la forme de intnoms de constantes SC_<description>. Voir http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html

David Rabinowitz
la source
3
HttpServletResponse prend en charge le RFC1945 et une partie des normes RFC2616, mais il manque tout le RFC2518. Si vous avez besoin d'une liste complète, consultez HttpStatus comme je l'ai mentionné.
John Feminella
2
HttpServletResponse manque également le code de réponse 418 défini dans RFC 2324
daiscog
L'utilisation de HttpServletResponse dans tout ce qui s'exécute en dehors d'un servlet est susceptible de provoquer des problèmes de dépendance au diamant en raison du chevauchement des classes dans différents artefacts de servlet.
Elliotte Rusty Harold
51

Eh bien, il existe des constantes statiques des valeurs entières exactes dans la classe HttpURLConnection

Mystique
la source
6
THX! cela fonctionne sans aucune dépendance externe. java.net.HttpURLConnection.HTTP_BAD_REQUEST
comonad
C'est bien qu'il fasse partie de la bibliothèque standard mais malheureusement il est incomplet - dans la gamme 400 par exemple il coupe à 415.
tschumann
18

Si vous utilisez Spring, la version 3.x a ce que vous cherchez: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html

Ed J
la source
3
Je voudrais ajouter que l'énumération Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/… ) est la seule que j'ai pu trouver qui fournit une documentation Java avec des liens à la liste complète des codes d'état et de leur utilisation dans chaque énumération. Si vous utilisez déjà Spring, ce sera la bibliothèque à utiliser.
lastmannorth
2
Il a 100 et 418. Dommage que vous deviez appeler HttpStatus.XXX.value()pour obtenir l'int.
WesternGun
7

Si vous utilisez Netty , vous pouvez utiliser:

Andrejs
la source
malheureusement ce n'est pas une énumération et donc pas utilisable dans les déclarations de cas (ce qui me rend triste)
Frederick Roth
7

Tout le monde semble ignorer la partie "type énumération" de votre question.

Bien qu'il n'y ait pas de source canonique pour les codes d'état HTTP, il existe un moyen simple d' ajouter les constantes d'état manquantes dont vous avez besoin à celles fournies par javax.ws.rs.core.Response.Statussans ajouter de dépendances supplémentaires à votre projet.

javax.ws.rs.core.Response.Statusn'est qu'une implémentation de l' javax.ws.rs.core.Response.StatusTypeinterface. Il vous suffit de créer votre propre énumération d'implémentation avec les définitions des codes d'état que vous souhaitez.

Les bibliothèques de base comme Javax, Jersey, etc. sont écrites sur l' interface et StatusType non sur l' implémentation Status (ou elles devraient certainement l' être). Étant donné que votre nouvelle énumération d'état implémente, StatusTypeelle peut être utilisée n'importe où vous utiliseriez une javax.ws.rs.core.Response.Statusconstante.

N'oubliez pas que votre propre code doit également être écrit sur l' StatusTypeinterface. Cela vous permettra d'utiliser à la fois vos propres codes de statut et ceux "standard".

Voici un résumé avec une implémentation simple avec des constantes définies pour les codes d'état "Informationnel 1xx": https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

David Avendasora
la source
5

Utilisez la classe javax.servlet.http.HttpServletResponse

Exemple:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500
Andrés Canavesi
la source
4
pour le développement client, il est fastidieux d'inclure l'intégralité de l'API servlet juste pour récupérer ces codes.
Jeffrey Blattman
1
Cela peut être fastidieux dans certains cas, mais j'ai trouvé cette bonne réponse et j'écris une application Web basée sur des servlets, donc c'est bon pour moi.
Andrei Rînea
2
Une réponse en double, publiée plus de trois ans plus tard? Doit être supprimé.
zb226
4

1) Pour obtenir le texte du motif si vous ne disposez que du code, vous pouvez utiliser:

org.apache.http.impl.EnglishReasonPhraseCatalog.INSTANCE.getReason(httpCode,null)

httpCodeserait le code anomalie que vous avez obtenu de la réponse HTTP.

Voir https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html pour plus de détails

2) Pour obtenir le code anomalie si vous ne disposez que du texte, vous pouvez utiliser BasicHttpResponse.

Voir ici pour plus de détails: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html

Baie de Maira
la source
0

Le meilleur fournisseur de constantes de code d'état http est probablement la classe org.eclipse.jetty.http.HttpStatus de Jetty car:

  • il y a un paquet javadoc dans maven qui est important si vous recherchez la constante et ne connaissez que le nombre -> ouvrez simplement la page api docs et recherchez le nombre
  • les constantes contiennent le numéro de code d'état lui-même.

Seule chose que j'améliorerais: mettez le numéro de code de statut devant la description textuelle afin de rendre la recherche de complétion automatique plus pratique lorsque vous commencez avec le code.

user1050755
la source
-1

Une autre option consiste à utiliser la HttpStatusclasse du Apons commons-httpclient qui vous fournit les différents statuts Http comme constantes.

ak123
la source