如何在Android上调用SOAP Web服务[关闭]

老子叫甜甜 提交于 2020-02-27 20:33:14
关闭。 这个问题是题外话。 它当前不接受答案。 了解更多

想改善这个问题吗? 更新问题 ,使其成为Stack Overflow 的主题

2年前关闭。

我很难找到有关如何使用Android调用标准SOAP / WSDL Web服务的良好信息。 我所能找到的只是非常复杂的文档和对“ kSoap2”的引用,然后是一些有关使用SAX手动解析它们的内容。 好的,很好,但是是2008年,所以我认为应该有一些不错的库来调用标准Web服务。

Web服务基本上只是在NetBeans中创建的一种。 我希望IDE支持生成管道类。 我只需要最简单/最优雅的方法就可以从基于Android的电话联系基于WSDL的Web服务。


#1楼

几个月前,我在j2ee应用程序中使用jax-ws Web服务,我们在使用CXF wsdl2java从WSDL文件生成WS客户端存根,并使用这些客户端存根消耗了Web服务。 几周前,当我试图以相同的方式在android平台中使用Web服务时,我做不到,因为android jar中没有所有的“ jax-ws”支持类。 那个时候,我没有找到任何可以满足我的要求的工具(如果我没有失败地进行有效的Google搜索)-

  • 从WSDL获取客户端存根。
  • 并使用一些参数调用服务(java业务请求对象)。
  • 获取响应业务对象。

因此,我开发了自己的Android SOAP客户端生成工具 。 您必须按照以下步骤操作:

  • 从WSDL获取WS Client Stub,将其放入您的项目中。
  • 对某些服务说“ ComplexOperationService”,实例化服务,获取端点端口并调用服务方法,并从Web服务获取响应:

例如:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • 您无需关心服务类/请求/响应类或任何其他类以及方法,因为您知道它们都是从WSDL生成的。
  • 当然,您无需了解soap action / envelop / namespace等。就像我们开发人员一直在调用的方法一样。

#2楼

如果您在使用android调用Web服务时遇到问题,则可以使用以下代码来调用Web服务并获得响应。 确保您的Web服务以数据表格式返回响应。如果您使用SQL Server数据库中的数据,则此代码将为您提供帮助。 如果您使用MYSQL ,则需要更改一件事,只需将句子obj2=(SoapObject) obj1.getProperty("NewDataSet");单词NewDataSet替换即可 obj2=(SoapObject) obj1.getProperty("NewDataSet"); 通过DocumentElement

void callWebService(){ 

private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name
private static final String URL = "http://localhost/sample/services/MyService?wsdl";
// you can use IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = "urn:" + METHOD_NAME;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("parm_name", prm_value);// Parameter for Method
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;// **If your Webservice in .net otherwise remove it**
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service
                                                                                                         // Method
    } catch (Exception e) {
        e.printStackTrace();
    }

    // Next task is to get Response and format that response
    SoapObject obj, obj1, obj2, obj3;
    obj = (SoapObject) envelope.getResponse();
    obj1 = (SoapObject) obj.getProperty("diffgram");
    obj2 = (SoapObject) obj1.getProperty("NewDataSet");

    for (int i = 0; i < obj2.getPropertyCount(); i++) { 
// the method getPropertyCount() and  return the number of rows
            obj3 = (SoapObject) obj2.getProperty(i);
            obj3.getProperty(0).toString();// value of column 1
            obj3.getProperty(1).toString();// value of column 2
            // like that you will get value from each column
        }
    }

如果对此有任何疑问,可以给我写信。


#3楼

通过SOAP方法执行以下步骤

在WSDL文件中,

  • 为每个请求创建SOAP请求模板。

  • 然后替换要在代码中传递的值。

  • 使用DefaultHttpClient实例将此数据发布到服务端点。

  • 获取响应流,最后

  • 使用XML Pull解析器解析响应流。


#4楼

要从android调用SOAP Web服务,请尝试使用此客户端

不要忘记在Java构建路径中添加ksoap2-android.jar

public class WsClient {
    private static final String SOAP_ACTION = "somme";
    private static final String OPERATION_NAME = "somme";
    private static final String WSDL_TARGET_NAMESPACE = "http://example.ws";
    private static final String SOAP_ADDRESS = "http://192.168.1.2:8080/axis2/services/Calculatrice?wsdl";

    public String caclculerSomme() {

        String res = null;
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);
        request.addProperty("a", "5");
        request.addProperty("b", "2");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);

        try {
            httpTransport.call(SOAP_ACTION, envelope);
            String result = envelope.getResponse().toString();
            res = result;
            System.out.println("############# resull is :" + result);
        } catch (Exception exception) {
            System.out.println("########### ERRER" + exception.getMessage());
        }

        return res;
    }
}

#5楼

不要忘记在项目中添加ksoap2.jar并在AndroidManifest文件中添加INTERNET权限

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

    private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
    private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl"; 
    private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
    private static final String METHOD_NAME = "AuthenticateTest";
    private TextView lblResult;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lblResult = (TextView) findViewById(R.id.tv);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("name","44vmMAYrhjfhj66fhJN");
        request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);

            //SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            // SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;


            lblResult.setText(resultsRequestSOAP.toString());
            System.out.println("Response::"+resultsRequestSOAP.toString());


        } catch (Exception e) {
            System.out.println("Error"+e);
        }

    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!