读取Java中的错误响应主体
在 Java 中,当 HTTP 结果为 404 范围时,此代码会引发异常:
URL url = new URL("http://stackoverflow.com/asdf404notfound");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.getInputStream(); // throws!
在我的例子中,我碰巧知道内容是 404,但我仍然想读取响应的正文。
(在我的实际情况中,响应代码是 403,但响应正文解释了拒绝的原因,我想向用户显示该原因。)
如何访问响应正文?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
这是错误报告(关闭,不会修复,不是错误) 。
他们的建议是这样编码:
Here is the bug report (close, will not fix, not a bug).
Their advice there is to code like this:
这和我遇到的问题是一样的:
如果您尝试从连接读取
getInputStream()
,HttpUrlConnection
将返回FileNotFoundException
。当状态码高于 400 时,您应该使用
getErrorStream()
。超过此值,请小心,因为成功状态码不仅是 200,甚至 201、204 等也是如此。经常被用作成功状态。
这是我如何管理它的示例。
通过这种方式,您将能够在成功和错误情况下获得所需的响应。
希望这可以帮助!
It's the same problem I was having:
HttpUrlConnection
returnsFileNotFoundException
if you try to read thegetInputStream()
from the connection.You should instead use
getErrorStream()
when the status code is higher than 400.More than this, please be careful since it's not only 200 to be the success status code, even 201, 204, etc. are often used as success statuses.
Here is an example of how I went to manage it
In this way, you'll be able to get the needed response in both success and error cases.
Hope this helps!
在 .Net 中,您拥有 WebException 的 Response 属性,该属性允许在异常时访问流。 所以我想这对于 Java 来说是一个好方法,...
或者我使用的一个实现。 (可能需要更改编码或其他内容。适用于当前环境。)
In .Net you have the Response property of the WebException that gives access to the stream ON an exception. So i guess this is a good way for Java,...
Or an implementation i used. (Might need changes for encoding or other things. Works in current environment.)
我知道这并不能直接回答问题,但您可能不想使用 Sun 提供的 HTTP 连接库,而是看看 Commons HttpClient,(在我看来)它有一个更容易使用的 API。
I know that this doesn't answer the question directly, but instead of using the HTTP connection library provided by Sun, you might want to take a look at Commons HttpClient, which (in my opinion) has a far easier API to work with.
首先检查响应代码,然后使用
HttpURLConnection.getErrorStream()
First check the response code and then use
HttpURLConnection.getErrorStream()
我的运行代码。
My running code.
如何在java中读取404响应正文:
使用Apache库 - https://hc.apache.org/httpcomponents-client-4.5.x/httpclient/apidocs/
或
Java 11 - https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html
下面给出的代码片段使用 Apache:
How to read 404 response body in java:
Use Apache library - https://hc.apache.org/httpcomponents-client-4.5.x/httpclient/apidocs/
or
Java 11 - https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html
Snippet given below uses Apache: