在我的Java servlet中,有些实例需要返回表示错误的HTTP状态代码,我希望客户端能够根据返回的状态代码读取和处理响应。例如,我的应用程序处理Google App Engine Java运行时的Channel API。如果请求的客户端ID尚未请求通道的令牌,则servlet将返回 403 状态代码,客户端将相应地处理响应(立即从servlet请求令牌)。 / p>
但是,当客户端使用 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);
答案 0 :(得分:2)
在我写这篇文章的时候,我开始认为也许我应该这样做 如果我读取状态代码,则不从连接的输入流中读取 从表示不成功的连接。无论如何,我会爱 听听别人对此的看法。
我认为你是对的。在从输入流中读取之前,您必须检查状态。