来自SOAP webservices的GetResponse在Android中

时间:2012-04-24 07:08:36

标签: android web-services soap android-ksoap2

我想从SAP SOAP Web服务获得响应,但我得到了一个例外。

我正在使用以下代码:

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)

请提供任何建议以克服此问题或发送如何通过Android中的XML提出请求并接收回复。

提前致谢.....

3 个答案:

答案 0 :(得分:1)

AVoid在android中使用SOAP ..因为不推荐使用。

使用由官方支持的Restful webservices。 如果您的网络服务提供商无法提供Restful服务,...承担一些问题,例如应用程序将无法正常工作,并且可能无法在某些Android设备中运行。

要解决使用多个ksoap2驱动程序的ksoap2实现问题,请将网络调用的逻辑放在一个单独的线程中。

对httptransport.call的调用(SOAP_ACTION,envelope);消耗巨大的内存,更多的时间,从而避免在主线程中使用此调用。尝试使用新的创建模拟器和其中一个设备。 KSOAP2可以运行20到50%的Android设备。有时它可能无法在同一制造商的设备中工作,例如它可能在HTC意义上的2.3.4中工作,并且可能在HTC Sense的2.3.5版本中不起作用。

建议使用Restful Webservices。

答案 1 :(得分:0)

当套接字在某个时间间隔内无法读取或接受时,会发生socketTimeoutException。你应该总是为这样的事情做好准备,并在你的代码中使用try / catch来处理这些情况。

一般来说,访问网络服务;确保您的应用在其清单中包含android.permission.INTERNET,并检查是否可以从模拟器访问该网络服务。您可以使用this post中的代码来检查您的服务是否可以访问。

答案 2 :(得分:0)

您可以使用

使用ksoap2 library 2.5.2 with dependencies手动设置超时限制
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,Time_Out);