【问题标题】:Retrieving server side HTTP error messages in Java在 Java 中检索服务器端 HTTP 错误消息
【发布时间】:2017-05-02 09:43:25
【问题描述】:

根据我在 Python 和 C#(控制台应用程序)中给出的示例,我正在构建一个后端服务器端 Java 应用程序,该应用程序使用 post 方法将数据发送到 API。此 API 具有与各种响应代码相关联的特定响应。我尝试使用下面的代码,但响应消息似乎只是与响应代码关联的通用系统消息,而不是我正在访问的 API 上的消息。

 System.out.println("Response Code : " + connection.getResponseCode());
 System.out.println("Response Message : " + connection.getResponseMessage());

我在 C# 示例中看到他们正在使用 WebException 错误处理,但我找不到 Java 等价物,如果有的话。

编辑:这是我遇到的 403 错误,在 python 示例中,它返回了自定义响应

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: https://[redacted]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1926)
at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1921)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1920)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1490)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at javaapplication1.JavaApplication1.main(JavaApplication1.java:59)
Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: https://api.rentrak.com/tv/v3/national_airing_views
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
at javaapplication1.JavaApplication1.main(JavaApplication1.java:56)

这是我用来构建响应的代码

    StringBuilder response;
    try (BufferedReader in = new BufferedReader(
            new InputStreamReader(connection.getInputStream()))) {
        String inputLine;
        response = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
    }

【问题讨论】:

  • 如果我很理解你想得到一个http响应的响应代码?赖特?
  • 我想获取存储在 API 上的响应消息
  • 如果调用的 WS 是一个 SOAP 的,你会得到一个 SOAPFaultException 用于未建模的错误和一个普通的异常子类用于建模的错误。见this
  • 您可以使用try catch添加封闭代码。那么您将获得与您的发布请求相关的任何异常。在代码代码中,您将获得 http 响应代码和 http 响应消息(如代码:200,消息:ok)。如果想获得您请求的响应正文,您必须调用 getResponsebody()

标签: java api http error-handling server-side


【解决方案1】:

如果你只使用java.net.HttpURLConnection

对于成功响应,有connection.getInputStream() 来获取响应正文。

但是对于错误响应,错误响应正文将是connection.getErrorStream()

我的意思是示例服务器返回 HTTP 404 - 自定义 HTML 页面未找到错误。 该 HTML 将在错误流中而不是在输入流中。

当然,响应代码在connection.getResponseCode() 中为int(即404),响应消息在getResponseMessage() 中(即“未找到”)

【讨论】:

  • Response Error : sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@36d4b5c 是我得到的错误,我正在使用 HttpsURLConnection,我得到了授权密钥,但无法获得成功的响应。
  • HttpURLConnection 是抽象的,HttpsURLConnection 是它的扩展,也是抽象的。 sun.net.www.protocol.http.HttpURLConnection 是一个实现。您能发布一段代码吗?什么时候出现响应错误?
  • 到目前为止,当您得到它时,您必须从该流中读取实际响应。因为 sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@‌​36d4b5c 是未实现 toString() 时来自对象(即 HttpInputStream)的默认 toString() 消息的结果。
  • 我猜你快到了...只需阅读该流中的内容,然后打印它。
  • 我正在使用 getInputStream,但我回来时遇到了这个混乱的错误(上面已编辑)。如果响应是 JSON 对象,Java 是否能够打印出文本,或者我是否特别需要一些东西来解码 JSON 文本?我之所以这么问,是因为我的印象是 JSON 实际上只是一种文本的结构化机制,而不是实际的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2016-10-03
  • 2023-04-01
  • 2021-04-16
  • 2011-10-21
  • 2020-09-17
相关资源
最近更新 更多