【问题标题】:Webservice call returns error 500Webservice 调用返回错误 500
【发布时间】:2011-03-01 08:08:06
【问题描述】:

我已经开始了一个 Java 小项目。
我必须创建一个客户端,它将 xml 作为 HTTP POST 请求发送到 url。
我尝试使用java.net.* 包(以下是一段代码),但我收到如下错误:

java.io.IOException: Server returned HTTP response code: 500 for URL: "target url"
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
    at newExample.main(newExample.java:36)

我的代码如下:

try {
        URL url = new URL("target url");

        URLConnection connection = url.openConnection();

        if( connection instanceof HttpURLConnection )
            ((HttpURLConnection)connection).setRequestMethod("POST");

        connection.setRequestProperty("Content-Length", Integer.toString(requestXml.length()) );
        connection.setRequestProperty("Content-Type","text/xml; charset:ISO-8859-1;");
        connection.setDoOutput(true);
        connection.connect();           

        // Create a writer to the url
        PrintWriter writer = new PrintWriter(new
        OutputStreamWriter(connection.getOutputStream()));

        // Get a reader from the url
        BufferedReader reader = new BufferedReader(new
        InputStreamReader(connection.getInputStream()));

        writer.println();
        writer.println(requestXml);
        writer.println();
        writer.flush();

        String line = reader.readLine();
            while( line != null ) {
                    System.out.println( line );
                    line = reader.readLine();
            }


    } catch (MalformedURLException e) {
                    e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

请提供合适的示例或任何其他方法。

指出上述代码中的错误/错误或其他可能性。

我的 Web 服务在 spring 框架中

要发送的xml是字符串格式:requestXml

【问题讨论】:

  • HTTP 错误 500 是“内部服务器错误”,当服务遇到错误或抛出异常时返回的一般错误。您可能想阅读完整的响应正文,看看是否有任何进一步的信息
  • 错误代码 500 是内部服务器错误。所以我会真正专注于服务器而不是客户端。
  • 如果你的 URL 是正确的(可以从浏览器中检查),你可以做的不多。看起来像服务器端错误。

标签: java webservice-client httpurlconnection


【解决方案1】:

问题出在下面的代码

// Get a reader from the url
BufferedReader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));

由于服务可能并不总是向您返回正确的响应...当您通过 http 调用服务时,服务器本身可能不可用或服务不可用。因此,在从流中读取响应之前,您应该始终检查响应代码,根据您必须决定是从 inputStream 读取它以获得成功响应还是从 errorStream 读取它以获得失败或异常条件。

BufferedReader reader = null;

if(connection.getResponseCode() == 200)
{
reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
}
else
{
reader = new BufferedReader(new
InputStreamReader(connection.getErrorStream()));
}

这样就可以解决问题了

【讨论】:

【解决方案2】:

问题出在您的服务器代码或服务器配置中:

10.5.1 500 内部服务器错误

服务器遇到了一个意外情况,导致它无法完成请求。

(w3c.org/Protocols)

如果服务器在您的控制之下(应该是,如果我查看 URL [编辑前]),那么请查看服务器日志。

【讨论】:

    【解决方案3】:

    嗯,你应该关闭你的流和连接。 Java 7 或http://projectlombok.org/ 的自动资源管理可以提供帮助。但是,这可能不是主要问题。

    主要问题是服务器端出现故障。 HTTP 代码 500 表示服务器端错误。我不能告诉你原因,因为我不知道服务器端的部分。也许你应该看看服务器的日志。

    【讨论】:

      【解决方案4】:

      我认为您的问题是您在编写和关闭输出流之前打开了输入流。当然,Sun Tutorial 就是这样做的。

      如果你过早打开输入流,输出流可能会自动关闭,导致服务器看到一个空的 POST 请求。这可能足以导致它感到困惑并发送 500 响应。

      即使这不是导致 500 错误的原因,按照教程中规定的顺序执行操作也是一个好主意。首先,如果您在写完请求之前不小心读取了响应,您可能(至少暂时)锁定连接。 (事实上​​,看起来您的代码正在这样做,因为您没有在从阅读器读取之前关闭编写器。)

      另一个问题是您的代码不会在所有情况下都关闭连接,因此可能会泄漏网络连接。如果它反复这样做,很可能会导致更多的 IOExceptions。

      【讨论】:

        【解决方案5】:

        如果您正在调用外部 Web 服务并在 REST 调用中传递 JSON,请检查传递的值的数据类型。

        例子:

        { "originalReference":"8535064088443985",
          "modificationAmount":
            { "amount":"16.0",
              "currency":"AUD"
            },
          "reference":"20170928113425183949",
          "merchantAccount":"MOM1"
        }
        

        在此示例中,amount 的值作为字符串发送,Web 服务调用失败,服务器返回 HTTP 响应代码:500。 但是当发送了 amount: 16.0 时,即传递了一个 Integer,调用就通过了。尽管您在调用此类外部 API 时参考了 API 文档,但可能会遗漏此类小细节。

        【讨论】:

          猜你喜欢
          • 2017-08-16
          • 1970-01-01
          • 1970-01-01
          • 2014-10-04
          • 2022-01-10
          • 2013-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多