1

我想从 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 中使用 ksoap2 运行了一些示例,它工作正常。我的 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 发出请求和接收响应。

提前致谢.....

4

3 回答 3

1

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

使用 android 官方支持的 Restful webservices。如果您的网络服务提供商无法提供 Restful 服务,...请忍受一些问题,例如应用程序有时无法运行,并且可能无法在某些 android 设备上运行。

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

对 httptransport.call(SOAP_ACTION, envelope) 的调用;消耗大量内存,更多时间,因此避免在主线程中使用此调用。尝试使用新的创建模拟器和其中一个设备。KSOAP2 适用于 20% 到 50% 的安卓设备。有时它可能不适用于同一制造商的设备,例如它可能适用于 HTC Sense 2.3.4 并且可能不适用于 HTC Sense 2.3.5 版。

推荐使用 Restful Webservices。

于 2012-07-12T06:14:03.567 回答
0

您可以使用具有依赖关系的 ksoap2 库 2.5.2手动设置超时限制,方法是使用

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,Time_Out);
于 2012-04-26T06:46:48.403 回答
0

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

访问一般网络服务;确保您的应用程序包含android.permission.INTERNET在它的清单中,并检查是否可以从模拟器访问 Web 服务。您可以使用这篇文章中的代码来检查您的服务是否可以访问。

于 2012-04-26T06:40:45.113 回答