如何使用ksoap2-android SOAP客户端从WSDL生成适用于Android的Java代码?

36
我需要从Android应用程序访问现有的SOAP webservice。我已经提供了一些描述webservice的WSDL文件。阅读其他答案,似乎ksoap2-android是使用哪种SOAP客户端的方式。
然后下一个问题就是如何从WSDL文件生成所需的Java类,这就是我遇到困难的地方。据我所见,有以下选项:
1. AXIS2代码生成器 2. WSDL2ksoap 3. JAX-WS wsimport工具

我最初尝试了#1,使用AXIS2 Eclipse插件进行wsdl2code生成器。向导成功生成了许多Java代码,但它也将我的Android项目更改为某种Web服务项目,我从未能够使生成的任何内容编译,更不用说与ksoap2-android一起使用了。有人成功过吗?

我无法成功运行wsdl2ksoap,因为它似乎需要运行的Web服务,并且我目前只有WSDL文件。同样从阅读网页上来看,它似乎是一个处于初期阶段的项目,还没有准备好面市。

JAX-WS wsimport我还没有机会尝试。但是我不确定它所生成的是否可以与ksoap2-android一起使用?

问题:我如何从WSDL文件中生成Java文件,以便在Android上使用ksoap2-android SOAP客户端库?

提前感谢您。

(附言:是的,选择SOAP对于Android使用来说不是最佳选择,但我不能改变这一点。)


现在我能够通过在项目菜单中使用Eclipse Web服务客户端,将WSDL URL转换为类。 - Jashan PJ
@Marckaraujo 我也遇到了同样的问题,使用eclipse进行转换时生成的类文件存在一些不一致错误。因此我改用了wsdl2code生成器,现在已经可以正常工作了。 - Jashan PJ
1
希望很快就会到来。我们正在开发一个使用ksoap库的Android代码生成器。目前它可以与WCF服务配合使用,并且我们编写了一个易于使用的Eclipse插件和快捷键,方便刷新。到目前为止,我们还没有遇到任何问题,它可以节省大量编写ksoap类的时间。 - Steven Combs
@BjarkeFreund-Hansen,这方面有什么更新吗?你能给出什么建议吗? - user1851212
@user1851212: 不好意思,目前似乎是一个无底洞。我们正在使用一些拼凑在一起的恐怖脚本来生成一些对我们有用的Java代码,但一般情况下并没有什么用处。也许可以看一些较新的答案,但我不会抱太大希望。 - Bjarke Freund-Hansen
显示剩余5条评论
6个回答

14

我发现了一个自动生成 WSDL 到 Android 代码的工具:

http://www.wsdl2code.com/example.aspx

这里是代码:

public void callWebService()    {
    SampleService srv1 = new SampleService();
    Request req = new Request();
    req.companyId = "1";
    req.userName = "userName";
    req.password = "pas";
    Response response =  srv1.ServiceSample(req);
}

1
但这仅适用于.NET Web服务。 - mutkan
1
它与其他网络服务一起运行良好,除了像SOAP方法名称这样的小更改。 - Bennya
那个工具相当不错,帮我节省了大量时间。我是它的粉丝。 - MikeS
1
现在不可用。 - SergeyYu
@SergeyUr 这也是困扰我的问题。更改了WebService,现在需要重新生成Android类。你找到好的替代方案了吗? - Alex

11

我遇到了类似的情况(我只有wsdl文件而没有可用的webservice)。 我使用了http://easywsdl.com/来生成安卓类,没有遇到任何问题。 这个工具使用ksoap库。 这个工具的好处是它支持WCF扩展和类型,如带有IsReference属性或Guid的数据合同。


我赞同他们为我们项目中的Java客户端提供高质量的代码。 - Arefe

11

在进行了相当多的研究后,我的结论是,很遗憾目前没有(成熟的)可用工具。不管是 AXIS2 还是 JAX-WS 都无法在 Android 上运行,而 WSDL2ksoap 对于任何实际用途来说都太不成熟了。

然而,有一个叫做 wsclient++ 的专有工具可以非常好地完成这项工作。(请阅读下面关于实际使用情况的更新,它在实际使用中并不完全可靠。)它不使用 ksoap2-android 客户端库,而是有自己的库。

客户端库有点粗糙,因为它在 http 传输上有强制依赖,使得(单元)测试有点复杂。但是,由于源代码在分发的 jar 文件中可用,因此可以很容易地进行修改以允许 DI。

Wsdl 到 Java 生成器功能非常完美,将节省我们大量时间。

更新 在使用 wsclient++ 一段时间后,很明显生成的类非常简单粗暴,并且根本不处理错误情况。(每个方法声明 throws Exception)。

我们不再使用 wsclient++,我也不建议任何人使用它! 不幸的是,我们没有找到任何可行的替代方案。 :/

最终,我们使用 AXIS2 转换了我们的 WSDL 文件,然后编写了一堆自定义脚本来剥离和转换生成的 Java 文件,以便在 Android 上使用 ksoap2-android 库进行构建。这非常笨拙,需要大量手工劳动。如果您发现更好的方法或新的解决方案,请提供一个新的答案。


@Bjarke,我正在尝试在Android上实现wsdl,你是否打算出售你的wsclient++许可证?我想试一试,因为wsdl2ksoap并不是很好用。 - Marckaraujo
1
这个还是很麻烦吗?或者现在已经有一些好用的工具了,因为我们已经进入了2017年。 - sliders_alpha
@sliders_alpha 我不知道,我已经不在那个项目上工作了。也许你可以在问题上开一个奖金,寻求更好的解决方案,毕竟已经过去了几年? - Bjarke Freund-Hansen
非常抱歉提出这么老的话题。您尝试过使用ksoup2库吗?它是否可以完成工作,而不必像问题中提到的存根生成器一样生成所有这些类? - Rany
@BjarkeFreund-Hansen,我知道您已经不再参与这个项目了,但我有一个问题想请教您。为什么您需要从WSDL文件生成Java文件?ksoup2库不能胜任这项工作吗? - Rany
@Rany 可能会。可能 ksoup2 在我工作时还没有出现。如果它对你有用,那太好了。 - Bjarke Freund-Hansen

0

1
我必须承认,目前的版本(截至2012年4月23日)相当糟糕 - 它无法正确生成某些复杂类型和数组的存根。 - András Szepesházi
2
感谢您的查看。我在想我是否看错了页面。我按照第一个链接进入了以下网址:http://sourceforge.net/projects/ksoap2-stub-gen/files/。该页面显示:“此项目没有文件”。 - Hong
1
@Hong 你说得对,文件已经不见了(我刚刚检查了项目主页)。通过第二个链接访问的在线存根生成器仍然可用(我昨天测试过了)。此外,可下载版本似乎已经移动到这里:http://sourceforge.net/projects/ksoap2genstub/files/?source=navbar - András Szepesházi
我在使用下载版本时遇到了问题,与此处描述的情况相同:https://dev59.com/aFbUa4cB1Zd3GeqPDv_K - Hong
如果您也阅读了评论,就会发现下载位置已经移动到http://sourceforge.net/projects/ksoap2genstub/files/?source=navbar。 - András Szepesházi
显示剩余2条评论

0

我使用Apache CXF工具仅仅创建DTO,然后编写一个类来执行基于元素名称的基本解组操作。


0

我也曾经在iPhone上使用过一些自动生成的类,我希望在这里也能看到。

wsdl2code 是我在iPhone上使用过的类似工具之一。只需提供一个包含wsdl文件的url,就可以下载一些类。对我来说,最难的部分是下载所需的部分。我花了超过2分钟的时间进行搜索 :) 需要下载并拖放到ADT(Eclipse)中的ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar。这非常容易,特别是如果您已经在iPhone上使用了相应的工具-类似的工具我也用过。

然而,在我的情况下,我对解决方案并不满意,因为我觉得我正在使用大炮去打麻雀。在我的情况下,应该使用HTTP Post,而不是包含其他库的依赖项。

老实说,我并不太在意,因为一旦服务器端认为我们有无限的电池电量和无限的数据计划,那么我就闭上眼睛,不关心编组解组开销,它们会使用CPU(电池)增加通过网络传输的数据。

在最坏的情况下,对于移动设备来说,它应该是一个 JSON + HTTP POST 而不是 SOAP...
我建议与服务器端的开发人员进行沟通,并向他们解释为什么如果他们在向导上点了两次,我们还要在表单上点击才能获取生成的代码将会不好。至少在应用程序规模不大的情况下,即使是那样,也应该有预算来优化几个接口的实现,以适应移动设备。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接