2010-06-29 73 views
2

我在使用HTTP POST向API发送XML数据时遇到问题。将XML数据发布到使用Java的API的问题

如果我发送格式良好的XML,我得到一个错误信息:

服务器异常:无法访问已关闭的流

如果XML的格式不正确,我得到HTTP 500。如果我只是发送一个空字符串而不是使用XML的字符串,我会收到一条错误消息:EMPTY REQUEST

对于错误可能是什么,我没有太多的想法,但连接的工作原理是因为错误消息是以XML格式返回的。我只是将XML数据作为字符串发送。是否有可能我需要发送EOF到底?我该如何在Java代码中做到这一点?关于什么问题可以是任何其他想法?

的API在.NET做

这里是Java代码我使用张贴XML数据:

Authenticator.setDefault(new MyAuthenticator()); 
    String xmlRequestStatus = 
    "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><test><data>32</data></test>"; 
    System.out.println(xmlRequestStatus); 
    String contentType = "text/xml"; 
    String charset = "ISO-8859-1"; 
    String request = null; 
    URL url = null; 
    HttpURLConnection connection = null; 
    OutputStream output = null; 
    InputStream response = null; 
    try { 
    url = new URL("http://127.0.0.1/test"); 
    } catch (MalformedURLException e) { 
    e.printStackTrace(); 
    } 

    try { 
    connection = (HttpURLConnection)url.openConnection(); 
    connection.setDoOutput(true); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Accept-Charset", charset); 
    connection.setRequestProperty("Content-Type", contentType); 
    output = connection.getOutputStream(); 
    output.write(request.getBytes("ISO-8859-1")); 
    if(output != null) try { output.close(); } catch (IOException e) {} 

    response = connection.getInputStream(); 
     .... 

回答

1

它看起来不错,应该可以正常工作。然而,当你已经做过connection.setDoOutput(true);时,connection.setRequestMethod("POST");完全是多余的。

因为这个错误直接来自localhost托管的.NET webservice,你确定它没有错误编写吗?我不做.NET,但是Google得知它与MemoryStream有关。我专注于.NET代码并重新测试/调试它。也许那些related SO questions可能会有所帮助。

0

你需要做这样的事情,指定POST方法,

connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Length", "" + length); 

否则,它被视为GET,并且某些服务器不期望body与GET,因此流被关闭。

+0

谢谢,我补充说,但得到了同样的问题。我使用这个答案的代码:http://stackoverflow.com/questions/2793150/how-to-use-java-net-urlconnection-to-fire-and-handle-http-requests/2793153#2793153 – Jonas 2010-06-29 23:53:48

0

也许在控制流程的后面关闭OutputStream。所以,而不是这个:

output.write(request.getBytes("ISO-8859-1")); 
if(output != null) try { output.close(); } catch (IOException e) {} 

response = connection.getInputStream(); 

试试这个(也许添加刷新)?

output.write(request.getBytes("ISO-8859-1")); 
output.flush(); 
response = connection.getInputStream(); 

if(output != null) try { output.close(); } catch (IOException e) {} 
+0

谢谢,但它没有帮助:( – Jonas 2010-06-30 00:03:18

0

是不是应该是&lt;32而不是<32

+0

啊,这只是我的一个错字,抱歉,我现在更新了我的问题,我收到了同样的错误信息。 – Jonas 2010-06-30 07:39:54

0

它看起来像请求初始化为空,但事后没有设置。它应该不是

output.write(xmlRequestStatus.getBytes("ISO-8859-1"));