2013-05-04 67 views
2

我使用的下面過程中,調用web服務肥皂從機器人

1)創建用於此模板的SOAP請求和替代用戶提供的值在運行時創建一個有效的請求字符串模板。 2)將此字符串包裝在一個StringEntity中,並將其內容類型設置爲text/xml 3)在SOAP請求中設置此實體。

與httppost我張貼請求的幫助下,

我使用的是演示Web服務從w3schools.com

網址--->

http://www.w3schools.com/webservices/tempconvert.asmx

我試過是,

HttpPost httppost = new HttpPost("http://www.w3schools.com/webservices/tempconvert.asmx");   
     StringEntity se; 
     try { 
      SOAPRequestXML="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\"><soapenv:Header/><soapenv:Body><tem:CelsiusToFahrenheit><!--Optional:--><tem:Celsius>30</tem:Celsius></tem:CelsiusToFahrenheit></soapenv:Body></soapenv:Envelope>"; 
      Log.d("request is ", SOAPRequestXML+"!!!"); 
      se = new StringEntity(SOAPRequestXML,HTTP.UTF_8); 


     se.setContentType("text/xml"); 
     httppost.setHeader("Content-Type","application/soap+xml;charset=UTF-8"); 
     httppost.setEntity(se); 

     HttpClient httpclient = new DefaultHttpClient(); 
     BasicHttpResponse httpResponse = 
      (BasicHttpResponse) httpclient.execute(httppost); 
     HttpEntity resEntity = httpResponse.getEntity(); 
     t.setText(EntityUtils.toString(resEntity)); 



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

我可以t Ø得到的soapUI響應,所以肯定的代碼是錯誤的,因爲在模擬器我得到的輸出,

「因爲媒體類型不受支持的服務器不能服務請求」。

我是傳遞正確的參數HttpPost的構造還是我做出了正確的XML request.I嘗試了很多,但無法弄清楚。

謝謝

回答

1

我有一種預感,模擬器Android版本和手機版本是不同的。

但我有幾個建議。使用以下內容:

httppost.setHeader("Accept-Charset","utf-8"); 
httppost.setHeader("Accept","text/xml,application/text+xml,application/soap+xml"); 

同樣,將內容類型設置爲以上所有。

+0

httppost.setHeader(「Accept-Charset」,「utf-8」); working.Thanks – 2013-05-08 07:04:22

1

您是否嘗試過使用適用於Android的ksoap2庫?

,你可以在這裏找到它,給它一個鏡頭:

https://code.google.com/p/ksoap2-android/

希望這有助於!

+0

我能夠得到使用kso​​ap2的反應,但我不希望出現這種情況,我只想要一個響應,然後我可以分析它。 – 2013-05-07 11:23:50

3

我在c-sharpcorner.com寫了關於如何Call Web Service in Android Using SOAP的文章。

因此,許多人從那個文章的幫助。您也可以下載並運行。我將幫助您瞭解如何使用SOAP進行Web服務。

編輯

看看下面的鏈接。它使用kso​​ap處理複雜的數據。

+0

我用你的方法ie ksoap2和那工作得很好(好文章)從這個w3schools Web服務得到的結果。但我不想這樣做,因爲我將使用的服務將包含非常複雜的輸入和輸出XML。我想知道ksoap2能夠在這方面幫助我。請確認。 – 2013-05-07 11:30:04

+0

爲什麼不。它將幫助您綁定複雜的數據並通過互聯網發送。您可以將其用於複雜的服務。 – 2013-05-07 11:40:22

+0

嘿,我將使用java中製作的webservices而不是.net.Is那很好? – 2013-05-07 11:57:08

4

與您的代碼是要設置標題爲唯一的問題,

httppost.setHeader("Content-Type","application/soap+xml;charset=UTF-8"); 

代替,

httppost.setHeader("Content-Type", "text/xml;charset=UTF-8"); 

正如你可以看到這就是URL的請求 - >w3schoools,他們正在使用,

Content-Type: text/xml; charset=utf-8 

,你哪裏不通過相同的內容類型。所以,它給你錯誤,因爲,

由於不支持媒體類型,服務器無法處理請求。

所以,只需更改標題,您將得到所需的響應。

+0

輸入xml是否正確,因爲我使用soap ui來生成xml,並且輸入xml與soapui.is中生成的輸入xml相同,這是正確的方法嗎? – 2013-05-07 14:27:06

+0

yup輸入xml是正確的我曾嘗試過使用它。 – 2013-05-08 04:45:49

+0

謝謝你的答案。那有效。 – 2013-05-08 07:06:23

1

這種方式的HTML表單發佈123攝氏度。沒有肥皂或信封,只是工作:)

try { 
     HttpPost httppost = new HttpPost("http://www.w3schools.com/webservices/tempconvert.asmx/CelsiusToFahrenheit"); 
     StringEntity se = new StringEntity("Celsius=123"); 
     httppost.setEntity(se); 
     httppost.setHeader("Content-Type", "application/x-www-form-urlencoded"); 
     HttpResponse httpResponse = new DefaultHttpClient().execute(httppost); 
     HttpEntity resEntity = httpResponse.getEntity(); 
     return EntityUtils.toString(resEntity); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return e.getMessage(); 
    }