Java是否具有用于HTTP响应代码的完整枚举?


267

我想知道在某些标准Java类库中是否有一个枚举类型,该枚举类型为所有有效的HTTP响应代码定义了符号常量。它应支持与相应整数值之间的转换。

我正在调试一些使用javax.ws.rs.core.Response.Status的Java代码。它可以工作,但是仅定义了有效HTTP响应代码的一半。

Answers:


280

我认为标准Java类中没有一个是完整的。HttpURLConnection缺少很多代码,例如HTTP 100/Continue

不过,Apache HttpComponents中有完整的列表:(从使用寿命已尽的Apache Http Client
org.apache.http.HttpStatus代替)org.apache.commons.HttpClient.HttpStatus


5
没有“完整列表”之类的东西,因为状态代码可以并且确实会扩展。
朱利安·雷施克

16
@JulianReschke我认为这里的“完整”应表示“符合标准概述的所有代码”。
John Feminella 2012年

2
约翰:“标准”并未定义“所有”状态代码。这就是为什么有一个注册表。
朱利安·雷施克


1
@Donal:再次,不是一个好的清单。相关的是IANA注册管理机构。
朱利安·雷施克

66

javax.servlet.http.HttpServletResponseServlet API 的接口以int常量名称的形式包含所有响应代码SC_<description>。参见http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html


3
HttpServletResponse支持RFC1945和RFC2616标准的一部分,但缺少所有RFC2518。如果您需要完整的列表,请参阅我提到的HttpStatus。
约翰·费米内拉

2
HttpServletResponse也缺少RFC 2324中
daiscog

在servlet外部运行的任何事物中使用HttpServletResponse可能会由于不同servlet工件中的类重叠而导致菱形依赖问题。
Elliotte Rusty Harold

51

好吧,HttpURLConnection类中有确切整数值的静态常量。


6
谢谢!这没有任何外部依赖性。java.net.HttpURLConnection.HTTP_BAD_REQUEST
2016年

好,它的部分标准库的但不幸的是它未完成-例如它切断,在415 400系列
tschumann

18

如果您使用的是Spring,那么3.x发行版可以满足您的需求:http : //static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html


3
我想补充一下,Springs org.springframework.http.HttpStatus(docs.spring.io/spring/docs/current/javadoc-api/org/…)枚举是我发现的唯一一个提供Java文档链接的枚举。状态码及其在每个枚举中的用法的完整列表。如果您已经在使用Spring,那么这将是要使用的库。
lastmannorth

2
它有100和418。可怜,您必须致电HttpStatus.XXX.value()以获得整数。
WesternGun


7

每个人似乎都忽略了问题的“枚举类型”部分。

虽然没有HTTP状态代码的规范来源,但是有一种简单的方法可以将所需的任何缺少的Status常量添加到所提供的状态常量中,javax.ws.rs.core.Response.Status而无需在项目中添加任何其他依赖项。

javax.ws.rs.core.Response.Status只是该javax.ws.rs.core.Response.StatusType接口的一种实现。您只需要创建自己的实现枚举以及所需状态代码的定义。

诸如Javax,Jersey等之类的核心库是写入接口 StatusType而不是实现的 Status(或者确实应该写入)。由于新的Status枚举实现了,StatusType因此可以在任何使用javax.ws.rs.core.Response.Status常量的地方使用它。

只要记住您自己的代码也应该写入StatusType接口即可。这将使您能够同时使用自己的状态代码和“标准”代码。

这是一个具有简单实现方式的要点,该实现带有为“信息1xx”状态码定义的常量:https : //gist.github.com/avendasora/a5ed9acf6b1ee709a14a


5

使用javax.servlet.http.HttpServletResponse类

例:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500

4
对于客户端开发,仅包含整个servlet API只是为了挑选这些代码,这是一个负担。
Jeffrey Blattman

1
在某些情况下可能会很麻烦,但是我已经找到了这个很好的答案,并且我正在编写一个基于Servlet的Web应用程序,因此对我来说非常好。
AndreiRînea'15

2
三年后发布的重复答案?应该删除。
zb226 2015年

4

1)要获取原因文本(如果只有代码),可以使用:

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

httpCode您从HTTP响应中获得的原因代码在哪里?

有关详细信息,请参见https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html

2)如果只有文字,则要获取原因,可以使用BasicHttpResponse

详情请参阅这里:https : //hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html



0

HTTP状态代码常量的最佳提供程序可能是Jetty的org.eclipse.jetty.http.HttpStatus类,因为:

  • maven中有一个javadoc包,如果您搜索常量并且只知道数字,这非常重要->只需打开api docs页面并搜索数字
  • 常量包含状态码编号本身。

我唯一需要改进的地方是:将状态代码编号放在文本描述的前面,以便在从代码开始时更方便地进行自动完成查找。


-1

另一个选择是使用HttpStatusApache commons-httpclient中的类,该类为您提供各种Http状态作为常量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.