2012-04-24 48 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。