2010-06-29 83 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")); 
相關問題