Webservice调用返回错误500

时间:2011-03-01 08:08:06

标签: java webservice-client httpurlconnection

我用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

5 个答案:

答案 0 :(得分:21)

问题在于代码

// 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()));
}

这样可以解决问题

答案 1 :(得分:3)

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

  

10.5.1 500内部服务器错误

     

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

w3c.org/Protocols

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

答案 2 :(得分:1)

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

主要问题是服务器端失败。 HTTP代码500表示服务器端错误。我无法告诉你原因,因为我不知道服务器端部分。也许你应该查看服务器的日志。

答案 3 :(得分:1)

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

如果过早打开输入流,输出流可能会自动关闭,导致服务器看到空的POST请求。这可能足以使其混淆并发送500响应。

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

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

答案 4 :(得分:0)

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

示例:

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

在此示例中,amount的值作为字符串发送,webservice调用失败,Server返回HTTP响应代码:500。 但当发送金额:16.0,即整数通过时,电话就通过了。虽然您在调用此类外部API时已经引用了API文档,但可能会错过这样的小细节。