2012-04-24 33 views
1

我想從SAP SOAP Web服務獲取響應,但我得到一個異常。來自SOAP webservices的GetResponse在Android中

我用下面的代碼:

package com.veee.pack; 
import java.io.IOException; 
import android.app.Activity; 
import android.os.Bundle; 
import java.io.IOException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 
import org.ksoap2.SoapEnvelope; 
import org.ksoap2.SoapFault; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.AndroidHttpTransport; 
import org.ksoap2.transport.HttpTransportBasicAuth; 
import org.ksoap2.transport.HttpTransportSE; 
import org.w3c.dom.Element; 
import org.xmlpull.v1.XmlPullParserException; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class WeservicesExampleActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     //getting these values from wsdl file 
     //username and password appended as URL Parameters 
     final String NAMESPACE = "urn:sap-com:document:sap:soap:functions:mc-style"; 
     final String URL = "http://*********:8000/sap/bc/srt/wsdl/srvc_14DAE9C8D79F1EE196F1FC6C6518A345/wsdl11/allinone/ws_policy/document?sap-client=800&sap-user******&sap-password=************"; 
     final String METHOD_NAME = "Z_GET_CUST_GEN"; 
     final String SOAP_ACTION = "urn:sap-com:document:sap:soap:functions:mc-style/Z_GET_CUST_GEN"; 

     SoapObject request =new SoapObject(NAMESPACE, METHOD_NAME); 

     request.addProperty("Input", "1460"); 
     request.addProperty("Langu", "d"); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 

     envelope.setOutputSoapObject(request); 

     HttpTransportSE httptransport=new HttpTransportSE(URL); 
     httptransport.debug = true; 
     try { 

      //calling the services 
     httptransport.call(SOAP_ACTION, envelope); 

     Object result = (Object) envelope.getResponse(); 

     //getting the Response Here. 

     System.out.println("Result" + result.toString()); 

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

當我調試它終止應用程序在

httptransport.call(SOAP_ACTION, envelope); 

我在Android的它工作正常使用kso​​ap2跑了一些例子。我得到了我的logcat以下異常:

04-24 12:19:17.935: WARN/System.err(1569): java.net.SocketTimeoutException 
04-24 12:19:17.935: WARN/System.err(1569):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:130) 

請給予任何建議來解決這個問題,或發送我怎樣才能使請求並接收通過XML在Android上的響應。

預先感謝.....

+1

'java.net.SocketTimeoutException'似乎暗示您正在嘗試與未打開的服務進行通信。假設你的'URL'地址指向一個僅在你的內部網絡上公開的SAP服務 - 你如何連接到它,僅限WiFi?你可以使用Wireshark(或類似的)來檢查你是否連接到它? – Jens 2012-04-24 09:24:06

+0

感謝您回覆我使用有線網絡,但soapui親其工作良好如何使其更快在Android模擬器 – 2012-04-24 09:47:12

+0

是否有任何需要的設置? – 2012-04-24 09:47:40

回答

0

甲socketTimeoutException當插座不能讀取或一定的時間間隔內接受發生。你應該始終爲這樣的事情做好準備,並在代碼中使用try/catch來處理這些情況。

通常訪問Web服務;確保你的應用程序有清單中的android.permission.INTERNET,並檢查是否可以通過模擬器訪問Web服務。您可以使用this post中的代碼來檢查您的服務是否可以訪問。

1

避免因爲不建議將其設置超時限制。

使用Android官方支持的Restful web服務。 如果您的網絡服務提供商無法提供Restful服務,...承擔一些問題,如應用程序無法工作一些時間,可能無法在一些Android設備上工作。

爲了擺脫使用多個ksoap2驅動程序執行ksoap2實現的問題,請將網絡調用的邏輯放在單獨的線程中。

對httptransport.call(SOAP_ACTION,envelope)的調用;消耗巨大的內存,更多的時間,因此避免在主線程中使用此調用。嘗試一個新的創建模擬器和其中一個設備。 KSOAP2適用於Android設備的20%到50%。有時它可能無法在同一製造商的設備上工作,例如,它可能在HTC sense 2.3.4中運行,並且可能無法在HTC Sense的ver 2.3.5中運行。

建議使用Restful Webservices。