¿Java tiene una enumeración completa para los códigos de respuesta HTTP?

267

Me pregunto si hay un tipo de enumeración en alguna biblioteca de clases Java estándar que defina constantes simbólicas para todos los códigos de respuesta HTTP válidos. Debe admitir la conversión a / desde los valores enteros correspondientes.

Estoy depurando un código Java que usa javax.ws.rs.core.Response.Status. Funciona, pero solo define aproximadamente la mitad de los códigos de respuesta HTTP válidos.

Zoltan Szilagyi
fuente

Respuestas:

280

No creo que haya uno completo en las clases estándar de Java; HttpURLConnectionle faltan algunos códigos, como HTTP 100/Continue.

Sin embargo, hay una lista completa en Apache HttpComponents:
org.apache.http.HttpStatus(reemplazado org.apache.commons.HttpClient.HttpStatuspor Apache Http Client, que llegó al final de su vida útil )

John Feminella
fuente
55
No existe una "lista completa", ya que los códigos de estado pueden extenderse y pueden ampliarse.
Julian Reschke
16
@JulianReschke Creo que "completo" aquí debería entenderse como "conforme a todos los códigos descritos por el estándar".
John Feminella
2
John: "el estándar" no define "todos" los códigos de estado. Por eso hay un registro.
Julian Reschke
1
iana.org/assignments/http-status-codes/http-status-codes.xml tiene una gran lista que incluye el código = 100
Garis M Suero
1
@Donal: de nuevo, no es una buena lista. Lo relevante es el registro de la IANA.
Julian Reschke
66

La interfaz javax.servlet.http.HttpServletResponsede la API de servlet tiene todos los códigos de respuesta en forma de intnombres de constantes SC_<description>. Ver http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html

David Rabinowitz
fuente
3
HttpServletResponse admite el RFC1945 y parte de los estándares RFC2616, pero le faltan todos los RFC2518. Si necesita una lista completa, vea HttpStatus como mencioné.
John Feminella
2
A HttpServletResponse también le falta el código de respuesta 418 definido en RFC 2324
daiscog
Es probable que el uso de HttpServletResponse en cualquier cosa que se ejecute fuera de un servlet provoque problemas de dependencia del diamante debido a la superposición de clases en diferentes artefactos de servlet.
Elliotte Rusty Harold
51

Bueno, hay constantes estáticas de los valores enteros exactos en la clase HttpURLConnection

Místico
fuente
66
¡Gracias! Esto funciona sin ninguna dependencia externa. java.net.HttpURLConnection.HTTP_BAD_REQUEST
comonad
Es bueno que sea parte de la biblioteca estándar, pero desafortunadamente está incompleta: en el rango de 400, por ejemplo, se corta a 415.
tschumann
18

Si está utilizando Spring, la versión 3.x tiene lo que está buscando: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html

Ed J
fuente
3
Me gustaría agregar que Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/… ) enum, es el único que pude encontrar que proporciona documentación de Java con enlaces a la lista completa de códigos de estado y su uso en cada enumeración. Si ya está utilizando Spring, entonces esta sería la biblioteca para usar.
lastmannorth
2
Tiene 100 y 418. Lástima que tengas que llamar HttpStatus.XXX.value()para obtener int.
WesternGun
7

Si está utilizando Netty , puede usar:

Andrejs
fuente
desafortunadamente esto no es enumeración y, por lo tanto, no se puede usar en declaraciones de casos (lo que me pone triste)
Frederick Roth
7

Todo el mundo parece ignorar la parte del "tipo de enumeración" de su pregunta.

Si bien no hay una fuente canónica para los códigos de estado HTTP, hay una manera simple de agregar las constantes de estado que faltan que necesita a las proporcionadas javax.ws.rs.core.Response.Statussin agregar dependencias adicionales a su proyecto.

javax.ws.rs.core.Response.Statuses solo una implementación de la javax.ws.rs.core.Response.StatusTypeinterfaz. Simplemente necesita crear su propia enumeración de implementación con definiciones para los códigos de estado que desee.

Las bibliotecas principales como Javax, Jersey, etc. están escritas en la interfaz, StatusType no en la implementación Status (o ciertamente deberían estarlo). Dado que su nuevo estado enum implementa StatusTypese puede usar en cualquier lugar donde usaría una javax.ws.rs.core.Response.Statusconstante.

Solo recuerde que su propio código también debe escribirse en la StatusTypeinterfaz. Esto le permitirá usar sus propios códigos de estado junto con los "estándar".

Aquí hay una idea básica con una implementación simple con constantes definidas para los códigos de estado "1xx informativo": https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

David Avendasora
fuente
5

Utilice la clase javax.servlet.http.HttpServletResponse

Ejemplo:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500
Andrés Canavesi
fuente
44
para el desarrollo del cliente, es engorroso incluir toda la API de servlet solo para recoger estos códigos.
Jeffrey Blattman
1
Puede ser oneroso para algunos casos, pero he encontrado esta buena respuesta y estoy escribiendo una aplicación web basada en servlet, así que es buena para mí.
Andrei Rînea
2
¿Una respuesta duplicada, publicada más de tres años después? Debería ser eliminado.
zb226
4

1) Para obtener el texto del motivo si solo tiene el código, puede usar:

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

¿Dónde httpCodeestaría el código de razón que obtuvo de la respuesta HTTP?

Ver https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html para más detalles

2) Para obtener el código de razón si solo tiene el texto, puede usarlo BasicHttpResponse.

Ver aquí para más detalles: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html

Bahía Maira
fuente
0

Es probable que el mejor proveedor de constantes de código de estado http sea la clase org.eclipse.jetty.http.HttpStatus de Jetty porque:

  • hay un paquete javadoc en maven que es importante si busca la constante y solo conoce el número -> simplemente abra la página de api docs y busque el número
  • las constantes contienen el número del código de estado en sí.

Lo único que mejoraría: coloque el número del código de estado delante de la descripción del texto para que la búsqueda de autocompletado sea más conveniente cuando comience con el código.

usuario1050755
fuente
-1

Otra opción es usar la HttpStatusclase de Apache commons-httpclient que le proporciona los diversos estados Http como constantes.

ak123
fuente