【问题标题】:GetResponse from SOAP webservices In Android来自 Android 中 SOAP 网络服务的 GetResponse
【发布时间】:2012-04-24 07:08:36
【问题描述】:

我想从 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 发出请求和接收响应。

提前谢谢.....

【问题讨论】:

  • java.net.SocketTimeoutException 似乎暗示您正在尝试与未打开的服务进行通信。假设您的URL 地址指向仅在您的内部网络上公开的 SAP 服务 - 您如何连接到它,仅限 WiFi?你可以使用 Wireshark(或类似的)来检查你是否连接到它吗?
  • 感谢您的回复,我正在使用有线网络,但soapui pro 工作正常,如何让它更快
  • 在Android模拟器中是否需要任何设置?
  • 有线网络?从未听说过那种网络分析仪。无论如何,既然您显然是在模拟器上运行 - 您在网络分析仪的连接日志中看到了什么?您在网络中使用proxy 吗?您可以使用模拟器中的默认网络浏览器浏览到一些随机网站,例如 www.google.com 吗?
  • 是的,我在我的电脑上使用有线网络。这将是一个基于路由器的网络。我在 android 模拟器浏览器中浏览一些网站,它对我来说工作正常

标签: android web-services soap android-ksoap2


【解决方案1】:

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

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

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

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

推荐使用Restful Webservices。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以使用ksoap2 library 2.5.2 with dependencies手动设置超时限制

      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,Time_Out);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 2014-04-23
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多