2011-03-01 102 views
8

我已經在Java中啓動了一個小型項目。
我必須創建一個客戶端,它會將xml發送到URL作爲HTTP POST請求。
我嘗試使用java.net.*包(以下是一段代碼),但我如下收到錯誤:Webservice調用返回錯誤500

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

+0

HTTP錯誤500是「內部服務器錯誤」,當服務遇到錯誤或返回異常時返回的一般錯誤。您可能想要閱讀完整的響應主體並查看是否有任何其他信息 – 2011-03-01 08:12:02

+0

錯誤代碼500是內部服務器錯誤。所以我專注於服務器而不是客戶端。 – sfussenegger 2011-03-01 08:13:11

+0

如果你的URL是正確的(可以從瀏覽器中檢查),你可以做的事情不多。看起來像服務器端錯誤。 – Nishant 2011-03-01 08:13:42

回答

3

的問題是您的服務器代碼或服務器配置中:

10.5.1 500內部服務器錯誤

服務器遇到意外情況,阻止它履行r eQUEST的。

w3c.org/Protocols

如果服務器是你的控制之下(應該是,如果我看的URL [編輯之前]),然後看看服務器日誌。

1

那麼,你應該關閉你的流和連接。來自Java 7或http://projectlombok.org/的自動資源管理可以提供幫助。但是,這可能不是主要問題。

主要問題是服務器端發生故障。 HTTP代碼500意味着服務器端錯誤。我不能告訴你原因,因爲我不知道服務器端的一部分。也許你應該看看服務器的日誌。

1

我認爲你的問題是你在寫入和關閉輸出流之前打開輸入流。當然,Sun Tutorial這樣做。

如果您過早打開輸入流,輸出流可能會自動關閉,導致服務器看到一個空的POST請求。這可能足以導致它感到困惑併發送500響應。

即使這不是導致500錯誤的原因,按照教程中列出的順序進行操作也不失爲一個好主意。首先,如果在寫完請求之前意外地讀取了響應,您可能(至少暫時)鎖定連接。 (實際上,看起來你的代碼是這樣做的,因爲你在閱讀閱讀器之前沒有關閉作者。)

另一個問題是你的代碼在任何情況下都不會關閉連接,泄漏網絡連接。如果重複執行此操作,則可能會導致更多IOException。

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

如果你調用外部web服務,並在REST調用傳遞一個JSON這樣就解決了問題

+0

優秀的答案! – 2016-06-06 18:22:57

0

,檢查傳遞的值的數據類型。

實施例:

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

在這個例子中,量的值被送往作爲一個字符串和該web服務調用與服務器未能返回HTTP響應代碼:500 但是當量:16.0是發送,即一個Integer被傳遞,通話通過。儘管您在調用這些外部API時已經提到了API文檔,但是這樣的小細節可能會被忽略。