Does Java have a complete enum for HTTP response codes?
JavaHttpJava Problem Overview
I'm wondering if there is an enum type in some standard Java class library that defines symbolic constants for all of the valid HTTP response codes. It should support conversion to/from the corresponding integer values.
I'm debugging some Java code that uses javax.ws.rs.core.Response.Status
. It works, but it only defines about half of the valid HTTP response codes.
Java Solutions
Solution 1 - Java
I don't think there's one that's complete in the standard Java classes; HttpURLConnection
is missing quite a few codes, like HTTP 100/Continue
.
There's a complete list in the Apache HttpComponents, though:
org.apache.http.HttpStatus
(replaced org.apache.commons.HttpClient.HttpStatus
from Apache Http Client, which reached end of life)
Solution 2 - Java
The Interface javax.servlet.http.HttpServletResponse
from the servlet API has all the response codes in the form of int
constants names SC_<description>
. See http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html
Solution 3 - Java
Well, there are static constants of the exact integer values in the HttpURLConnection class
Solution 4 - Java
If you're using Spring, the 3.x release has what your looking for: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html
Solution 5 - Java
Everyone seems to be ignoring the "enum type" portion of your question.
While there is no canonical source for HTTP Status Codes there is an simple way to add any missing Status constants you need to those provided by javax.ws.rs.core.Response.Status
without adding any additional dependencies to your project.
javax.ws.rs.core.Response.Status
is just one implementation of the javax.ws.rs.core.Response.StatusType
interface. You simply need to create your own implementation enum with definitions for the Status Codes that you want.
Core libraries like Javax, Jersey, etc. are written to the interface StatusType
not the implementation Status
(or they certainly should be). Since your new Status enum implements StatusType
it can be used anyplace you would use a javax.ws.rs.core.Response.Status
constant.
Just remember that your own code should also be written to the StatusType
interface. This will enable you to use both your own Status Codes along side the "standard" ones.
Here's a gist with a simple implementation with constants defined for the "Informational 1xx" Status Codes: https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a
Solution 6 - Java
If you are using Netty, you can use:
- io.netty.handler.codec.http.HttpResponseStatus
Solution 7 - Java
Here's an enum with status codes and their descriptions that (at time of writing) corresponds to the HTTP status code registry.
Note that the registry might get updated, and that sometimes unofficial status codes are used.
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);
}
}
Solution 8 - Java
Use javax.servlet.http.HttpServletResponse class
Example:
javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500
Solution 9 - Java
-
To get the reason text if you only have the code, you can use:
org.apache.http.impl.EnglishReasonPhraseCatalog.INSTANCE.getReason(httpCode,null)
Where httpCode
would be the reason code that you got from the HTTP response.
See https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html for details
- To get the reason code if you only have the text, you can use
BasicHttpResponse
.
See here for details: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html
Solution 10 - Java
Also check out the Restlet Status class:
http://www.restlet.org/documentation/1.1/api/org/restlet/data/Status.html
Solution 11 - Java
The best provider for http status code constants is likely to be Jetty's org.eclipse.jetty.http.HttpStatus class because:
- there is a javadoc package in maven which is important if you search for the constant and only know the number -> just open the api docs page and search for the number
- the constants contain the status code number itself.
Only thing I would improve: put the status code number in front of the text description in order to make auto-completion lookup more convient when you are starting with the code.
Solution 12 - Java
Please see the following enum from the Spring framework which provides all the HTTP response status code
HttpStatus.values()
Solution 13 - Java
Another option is to use HttpStatus
class from the Apache commons-httpclient which provides you the various Http statuses as constants.