当前位置:  开发笔记 > 编程语言 > 正文

如何在Android上调用SOAP Web服务

如何解决《如何在Android上调用SOAPWeb服务》经验,为你挑选了21个好方法。

我在查找如何使用Android调用标准SOAP/WSDL Web服务方面遇到很多麻烦.我能找到的所有文件都是非常复杂的文档和对"kSoap2"的引用,然后是一些关于使用SAX手动解析它的一些内容.好的,这很好,但是它是2008年,所以我认为应该有一些很好的库来调用标准的Web服务.

Web服务基本上是在NetBeans中创建的.我想有IDE支持生成管道类.我只需要最简单/最优雅的方式来从基于Android的手机联系基于WSDL的Web服务.



1> foxxtrot..:

Android不提供任何类型的SOAP库.您可以自己编写,也可以使用kSOAP 2之类的东西.正如您所说,其他人已经能够在他们自己的项目中编译和使用kSOAP2,但我没有必要.

到目前为止,谷歌对向Android添加SOAP库几乎没有兴趣.我对此的怀疑是,他们宁愿支持当前基于REST服务的Web服务趋势,并使用JSON作为数据封装格式.或者,使用XMPP进行消息传递.但这只是猜想.

基于XML的Web服务目前在Android上是一项稍微不重要的任务.不了解NetBeans,我不能说那里提供的工具,但我同意应该有更好的库.XmlPullParser可能会使您无法使用SAX,但我对此并不了解.


如果有人能够建议使用Android应用程序调用Web服务的最佳替代方案**,那么这个答案将得到改善.一旦人们发现这个问题并阅读它,那就是大多数人都会寻找的.
原因可能是SOAP非常冗长,并且不能很好地满足移动计算的限制.
是的,我想我必须建立一个REST代理.谷歌似乎没有兴趣提供SOAP支持,这似乎很奇怪.我尝试过kSoap方法,它甚至不是一个严肃的选择.充其量只是丑陋的,需要大量的新闻组.
与更简洁的格式(如JSON)相比,SOAP处理也是内存和处理器密集型的.
@MGOwen我能看到的最佳选择是代理.实现一个REST-ful接口,通过WSDL2Java代理SOAP信封.
KSoap库无法管理巨大的请求或响应.所有数据都加载到内存中,因此可能会发生App崩溃并发生OutOfMemory异常.

2> Neil..:

org.apache.http.impl.client.DefaultHttpClient默认情况下会出现在Android SDK中.那将让你连接到WSDL.

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);


你的意思是你不会得到免费的午餐.手动解析与OO无关.我可以解析纸上的所有东西,我最先进的工具是HB1铅笔,它仍然是OO.
顺便说一句,如果你想运气好,我希望至少HTTP POST不是GET.另外,Accept和SOAPAction标头在哪里?如果你真的想要使用突击队,那么使用SOAP服务需要的不仅仅是这4行.
我相信OO的作者意味着Java-XML绑定.这种方法解析响应的下一步是什么?如果它有数百个元素,以树形结构组织?
@NeilD:如果您被环境强迫使用SOAP,例如Web服务器使用SOAP并且您无法控制它,该怎么办?
是的,这将是我必须手动解析所有内容的路线,我不会得到面向对象的方法.

3> Viktor Breša..:

确实,由于它的开销,SOAP不是与移动设备进行数据交换的最佳选择.但是,您可能会发现自己处于无法控制服务器输出格式的情况.

所以,如果你必须坚持使用SOAP,那么有一个为Android安装的kSOAP2库:http:
//code.google.com/p/ksoap2-android/



4> Priyanjan..:

要从移动设备(特别是在Android手机上)调用Web服务,我使用了一种非常简单的方法来执行此操作.我没有使用任何Web服务客户端API来尝试调用Web服务.我的方法是拨打电话如下.

    使用Java标准API创建简单的HTTP连接 HttpURLConnection.

    形成SOAP请求.(您可以帮助SOAPUI发出SOAP请求.)

    将doOutPut标志设置为true.

    设置HTTP标头值,如内容长度,内容类型和用户代理.不要忘记设置Content-length值,因为它是必需的.

    将整个SOAP请求写入输出流.

    调用方法建立连接并接收响应(在我使用的情况下 getResonseCode).

    如果您收到的响应代码为

      这意味着您已成功调用Web服务.

    现在在同一HTTP连接上获取输入流并接收字符串对象.此字符串对象是SOAP响应.

    如果响应代码不是200,则ErrorInput在同一HTTP对象上获取流并接收错误(如果有).

    使用SAXParser(在我的情况下)或DOMParaser或任何其他解析机制解析收到的响应.

我已经为Android手机实现了这个程序,并且它已成功运行.即使响应超过700 KB,我也能够解析响应.



5> jasonhudgins..:

SOAP是一种不适合在Android(或一般移动设备)上使用的技术,因为它需要处理/解析开销.REST服务是一种更轻量级的解决方案,这就是我的建议.Android附带一个SAX解析器,使用起来相当简单.如果您绝对需要在移动设备上处理/解析SOAP,那么我为您感到遗憾,我能提供的最佳建议就是不使用SOAP.


对于那些强迫开发人员使用SOAP服务而不是REST API的人来说,这是一个特殊的地方。

6> Alex Gillera..:

大约一年前,我正在阅读这个线程,试图找出如何在Android上进行SOAP调用 - 使用HttpClient构建我自己的建议导致我为Android构建自己的SOAP库:

IceSoap

基本上,它允许您构建信封以通过简单的Java API发送,然后自动将它们解析为您通过XPath定义的对象...例如:


    
    

变为:

@XMLObject("//Dictionary")
public class Dictionary {
    @XMLField("Id")
    private String id;

    @XMLField("Name")
    private String name;
}

我用它为自己的项目,但我想它可能会帮助一些人,所以我花了一些时间分离出来,并记录它.我真的很喜欢它,如果你的一些可怜的灵魂在谷歌搜索"SOAP Android"时偶然发现这个线程可能会给它带来一些好处.



7> Amit kumar..:

不要忘记在项目中添加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);
        }

    }
}



8> Samuh..:

我跟KSOAP约会了; 我选择了一种相当简单的方法.

给定WSDL文件,为每个请求创建SOAP请求模板(例如:使用SOAP UI),然后替换要在代码中传递的值.使用DefaultHttpClient实例将此数据发布到服务端点并获取响应流.使用XML Pull解析器解析响应流.



9> Akash Kava..:

你可以看看WSClient ++


最后是重复kSoap或SAX之后的第一个有用的答案

10> Gábor AUTH..:

我为Android平台创建了一个新的SOAP客户端.它使用的是JAX-WS生成的接口,但到目前为止它只是一个概念验证.

如果您有兴趣,请尝试示例和/或在AndroidSOAP上观看来源.



11> 小智..:

如果可以,请选择JSON.Android附带完整的org.json包



12> DEVANG SHARM..:

调用ksoap2方法.它工作得非常好.

设置细节,比如

private static String mNAMESPACE=null;
private static String mURL=null;
public static Context context=null;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);

envelope.addMapping(mNAMESPACE, "UserCredentials",new UserCredendtials().getClass());
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(mURL);

然后得到结果呢

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();



13> Monte Chan..:

我希望从Android调用Web服务有所帮助.



14> 小智..:

几个月前,我在j2ee应用程序中使用jax-ws Web服务,我们使用CXF wsdl2java从WSDL文件生成WS客户端存根,并使用这些客户端存根来使用Web服务.几个星期前,当我试图消耗在android平台上我不能以同样的方式在网络服务,因为Android的罐子并没有所有的"JAX-WS"支持在它的类.那个时候我没有找到任何这样的工具(如果我没有有效地谷歌),以满足我的要求 -

从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  );

您不需要关心服务类/ req /响应类或任何其他类和方法,因为您知道它们都是从WSDL生成的.

当然,你不需要知道soap action/envelop/namespace等.只需像我们一样调用方法,开发人员一直这样做.



15> branchgabrie..:

我相信你可以用Axis创建一个小型的SOAP客户端.轴安装说明.


只有当轴与Android兼容时,这才有效.它不是(关于轴依赖的javax.*包的东西).

16> Srikanth Nai..:

我认为来自Android应用程序的Call SOAP Web Service 将为您提供很多帮助.



17> Daniele Teti..:

如果您可以使用JSON,那么在开发带有PHP服务器和Android手机客户端的应用程序服务中有一个白皮书,一个视频和sample.code .



18> Manick..:

按照SOAP方法执行这些步骤

从WSDL文件中

为每个请求创建SOAP请求模板.

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

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

最后得到响应流

使用XML Pull解析器解析响应流.



19> 小智..:

对我来说,最简单的方法是使用好的工具来生成所有必需的类.我个人使用这个网站:

http://easywsdl.com/

它支持相当复杂的Web服务并使用kso​​ap2.



20> Sachin D..:

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

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
        }
    }

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



21> miroslavign..:

我建议查看一个非常有用的工具,帮助了我很多.照顾这个项目的人也很有帮助.www.wsdl2code.com/

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有