【发布时间】:2012-10-02 06:19:26
【问题描述】:
在我的 Java servlet 中,在某些情况下,我希望返回一个表示错误的 HTTP 状态代码,并且我希望客户端能够根据返回的状态代码读取和处理响应。例如,我的应用程序为 Google App Engine Java 运行时处理 Channel API。如果请求的客户端 ID 尚未请求通道的令牌,则 servlet 将返回 403 状态代码,客户端将相应地处理响应(立即从 servlet 请求令牌)。
但是,当客户端使用 HttpURLConnection 读取 HTTP 响应时。我无法从输入流中读取响应,而是抛出了这个可爱的堆栈跟踪:
java.io.IOException: Server returned HTTP response code: 403 for URL: http://localhost:8083/rest/fb/echo
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1458)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1452)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1106)
...
Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: http://localhost:8083/rest/fb/echo
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1403)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:397)
在我写这篇文章的时候,我开始想如果我从连接中读取一个表示不成功的状态码,也许我不应该从连接的输入流中读取。无论如何,我很想听听其他人对此的看法。
注意
我的 servlet 使用 Sitebricks 为我的方法提供一个 REST 端点来监听。此外,Sitebricks 允许我发送响应和状态代码,如下所示:
MyObject response = ...;
int statusCode = ...;
...
return Reply.with(response).as(Json.class).type("application/json").status(statusCode);
【问题讨论】:
-
如果你捕捉到 IOException 并忽略它会发生什么?啊,哦等等……你在从输入流中读取之前检查返回码,对吧?
-
是的,我意识到在从输入流读取之前检查状态代码是正确的方法。
标签: java servlets httpurlconnection http-status-codes sitebricks