【问题标题】:How to handle HTTP response with a 4xx/5xx status code, Java servlet/HttpURLConnection如何使用 4xx/5xx 状态码 Java servlet/HttpURLConnection 处理 HTTP 响应
【发布时间】: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


【解决方案1】:

在写这篇文章的时候,我开始想也许我应该 如果我读取状态代码,则不会从连接的输入流中读取 从表示不成功的连接。无论如何,我愿意 听听其他人对此的看法。

我认为你是对的。在从输入流中读取之前,您必须检查状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 2017-03-07
    • 1970-01-01
    • 2016-06-11
    • 2013-06-01
    • 2011-10-02
    • 2011-11-10
    • 2012-06-26
    相关资源
    最近更新 更多