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

5 minutos de lectura

avatar de usuario
Zoltán Szilagyi

Me pregunto si hay un tipo de enumeración en alguna biblioteca de clases estándar de Java que defina constantes simbólicas para todos los códigos de respuesta HTTP válidos. Debería 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.

avatar de usuario
Juan Feminella

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

Sin embargo, hay una lista completa en Apache HttpComponents:
org.apache.http.HttpStatus (sustituido org.apache.commons.HttpClient.HttpStatus de Apache Http Client, que alcanzó fin de la vida)

  • No existe tal cosa como una “lista completa”, ya que los códigos de estado pueden extenderse y extenderse.

    – Julián Reschke

    22 de marzo de 2012 a las 7:14

  • @JulianReschke Creo que “completo” aquí debe entenderse como “cumple con todos los códigos descritos por el estándar”.

    – Juan Feminella

    22 de marzo de 2012 a las 15:19

  • John: “el estándar” no define “todos” los códigos de estado. Por eso hay un registro.

    – Julián Reschke

    23 de marzo de 2012 a las 20:58

  • iana.org/assignments/http-status-codes/http-status-codes.xml tener una gran lista que incluya el código = 100

    – Garis M Suero

    27 de marzo de 2013 a las 19:11

  • @Donal: de nuevo, no es una buena lista. Lo relevante es el registro de la IANA.

    – Julián Reschke

    11 de julio de 2013 a las 17:12

avatar de usuario
David Rabinowitz

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

  • HttpServletResponse es compatible con RFC1945 y parte de los estándares RFC2616, pero le falta todo RFC2518. Si necesita una lista completa, vea HttpStatus como mencioné.

    – Juan Feminella

    9 de abril de 2009 a las 3:57

  • A HttpServletResponse también le falta el código de respuesta 418 definido en RFC 2324

    – daiscog

    4 de marzo de 2016 a las 13:31

  • Es probable que el uso de HttpServletResponse en cualquier cosa que se ejecute fuera de un servlet genere problemas de dependencia de diamantes debido a la superposición de clases en diferentes artefactos de servlet.

    – Elliotte Rusty Harold

    29 de enero de 2019 a las 11:35

avatar de usuario
Místico

Bueno, hay constantes estáticas de los valores enteros exactos en el HttpURLConexión clase

  • ¡gracias! esto funciona sin dependencias externas. java.net.HttpURLConnection.HTTP_BAD_REQUEST

    – comonada

    26 de septiembre de 2016 a las 9:31

  • Es bueno que sea parte de la biblioteca estándar, pero desafortunadamente está incompleto: en el rango de 400, por ejemplo, se corta en 415.

    – Tschumann

    1 de mayo de 2020 a las 2:46

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

Todos parecen estar ignorando la parte de “tipo de enumeración” de su pregunta.

Si bien no existe una fuente canónica para los códigos de estado HTTP, existe una forma sencilla de agregar cualquier constante de estado faltante que necesite a las proporcionadas por javax.ws.rs.core.Response.Status sin agregar dependencias adicionales a su proyecto.

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

Las bibliotecas centrales como Javax, Jersey, etc. se escriben en el interfaz StatusType no la implementación Status (o ciertamente debería ser). Dado que su nueva enumeración de estado implementa StatusType se puede usar en cualquier lugar donde usaría un javax.ws.rs.core.Response.Status constante.

Solo recuerde que su propio código también debe escribirse en el StatusType interfaz. Esto le permitirá utilizar sus propios códigos de estado junto con los “estándar”.

Aquí hay una idea general con una implementación simple con constantes definidas para los códigos de estado “Informativo 1xx”: https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

avatar de usuario
Andrejs

Si estás usando Netopuedes usar:

Aquí hay una enumeración con códigos de estado y sus descripciones que (al momento de escribir) corresponde a la Registro de código de estado HTTP.

Tenga en cuenta que el registro puede actualizarse y que, a veces, se utilizan códigos de estado no oficiales.

public enum HttpStatusCode {

    //1xx: Informational
    CONTINUE(100, "Continue"),
    SWITCHING_PROTOCOLS(101, "Switching Protocols"),
    PROCESSING(102, "Processing"),
    EARLY_HINTS(103, "Early Hints"),

    //2xx: Success
    OK(200, "OK"),
    CREATED(201, "Created"),
    ACCEPTED(202, "Accepted"),
    NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"),
    NO_CONTENT(204, "No Content"),
    RESET_CONTENT(205, "Reset Content"),
    PARTIAL_CONTENT(206, "Partial Content"),
    MULTI_STATUS(207, "Multi-Status"),
    ALREADY_REPORTED(208, "Already Reported"),
    IM_USED(226, "IM Used"),

    //3xx: Redirection
    MULTIPLE_CHOICES(300, "Multiple Choice"),
    MOVED_PERMANENTLY(301, "Moved Permanently"),
    FOUND(302, "Found"),
    SEE_OTHER(303, "See Other"),
    NOT_MODIFIED(304, "Not Modified"),
    USE_PROXY(305, "Use Proxy"),
    TEMPORARY_REDIRECT(307, "Temporary Redirect"),
    PERMANENT_REDIRECT(308, "Permanent Redirect"),

    //4xx: Client Error
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    PAYMENT_REQUIRED(402, "Payment Required"),
    FORBIDDEN(403, "Forbidden"),
    NOT_FOUND(404, "Not Found"),
    METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
    NOT_ACCEPTABLE(406, "Not Acceptable"),
    PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"),
    REQUEST_TIMEOUT(408, "Request Timeout"),
    CONFLICT(409, "Conflict"),
    GONE(410, "Gone"),
    LENGTH_REQUIRED(411, "Length Required"),
    PRECONDITION_FAILED(412, "Precondition Failed"),
    REQUEST_TOO_LONG(413, "Payload Too Large"),
    REQUEST_URI_TOO_LONG(414, "URI Too Long"),
    UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"),
    REQUESTED_RANGE_NOT_SATISFIABLE(416, "Range Not Satisfiable"),
    EXPECTATION_FAILED(417, "Expectation Failed"),
    MISDIRECTED_REQUEST(421, "Misdirected Request"),
    UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"),
    LOCKED(423, "Locked"),
    FAILED_DEPENDENCY(424, "Failed Dependency"),
    TOO_EARLY(425, "Too Early"),
    UPGRADE_REQUIRED(426, "Upgrade Required"),
    PRECONDITION_REQUIRED(428, "Precondition Required"),
    TOO_MANY_REQUESTS(429, "Too Many Requests"),
    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"),
    UNAVAILABLE_FOR_LEGAL_REASONS(451, "Unavailable For Legal Reasons"),

    //5xx: Server Error
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
    NOT_IMPLEMENTED(501, "Not Implemented"),
    BAD_GATEWAY(502, "Bad Gateway"),
    SERVICE_UNAVAILABLE(503, "Service Unavailable"),
    GATEWAY_TIMEOUT(504, "Gateway Timeout"),
    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version Not Supported"),
    VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"),
    INSUFFICIENT_STORAGE(507, "Insufficient Storage"),
    LOOP_DETECTED(508, "Loop Detected"),
    NOT_EXTENDED(510, "Not Extended"),
    NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required");

    private final int value;
    private final String description;

    HttpStatusCode(int value, String description) {
        this.value = value;
        this.description = description;
    }

    public int getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return value + " " + description;
    }

    public static HttpStatusCode getByValue(int value) {
        for(HttpStatusCode status : values()) {
            if(status.value == value) return status;
        }
        throw new IllegalArgumentException("Invalid status code: " + value);
    }
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad