在我的 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);