用gSOAP更简单地实现Web Services Client

昨天折腾了一下那个gSOAP,发现这东西比Symbian自带的WebServiceAPI更简单方便,推荐使用!

gSOAP的官方网站是:http://gsoap2.sourceforge.net/

具体使用方法不多说,因为网上GOOGLE 一下很多资料。下面只对在symbian环境下使用略说几点。

下载的是最新版的v2.7.10,下载的压缩包里就有一个symbian目录,里面是在symbian的例子,可以参考。

试着做了一个HelloWorld,还是访问前面做的那个web service,按照它的例子步骤如下:

1.解开软件压缩包。

2.根据wsdl生成代码存根等H/CPP文件。在命令行进入gsoap/bin/win32 目录,先后执行以下指令:

wsdl2 -s -o pservice.h  http://192.168.0.201/uim/pservice.asmx?WSDL

在当前目录得到一个pservice.h文件。

soapcpp2 -CLwx pservice.h

在当前目录得到多个源文件,每个文件的具体作用含义大家可以看官方资料。

3.在Carbide C++中新建一个工程,我就叫它HelloWsTwo,直接用了那个HelloWorld模板框架。然后将步骤2生成的几个文件弄过去,首先将 soapH.h/soapStub.h/soapPServiceSoapProxy.h拷到工程的inc目录下,将soapC.cpp /soapClient.cpp拷到工程的src目录下。

4.还有两个文件在gsoap目录下,stdsoap2.h和stdsoap2.cpp,也拷入相应目录,这里其实按例子中的readme说明是不拷的,而是在mmp中修改一下指过来,不过,因为我们需要修改这个cpp所以方便起见,还是拷过去吧,省得跟其它工程弄混了。

5.先修改HelloWsTwoUi这个类,在头文件中增加如下代码:
view plaincopy to clipboardprint?

   1. // 此处省略  
   2.
   3. #include "soapPServiceSoapProxy.h"   
   4.   
   5. // FORWARD DECLARATIONS   
   6.   
   7. class CHelloWSTwoAppView;   
   8. class PServiceSoap;   
   9.   
  10. //此处省略   
  11.   
  12. private:   
  13.   
  14. CHelloWSTwoAppView* iAppView;   
  15.   
  16. PServiceSoap * iService;   
  17.   
  18. //此处省略  

// 此处省略

#include "soapPServiceSoapProxy.h"

// FORWARD DECLARATIONS

class CHelloWSTwoAppView;
class PServiceSoap;

//此处省略

private:

CHelloWSTwoAppView* iAppView;

PServiceSoap * iService;

//此处省略

引入那个代理头文件,然后加一个PServiceSoap类型的成员变量iService。接着修改cpp文件,在构造时new它,在析构时delete它即可。
view plaincopy to clipboardprint?

   1. case ECommand1:   
   2. {   
   3.   
   4. //webservice   
   5.   
   6.   
   7.   
   8. if(iService){   
   9.   
  10. _ns1__HelloWorldResponse resp;   
  11.   
  12. if(iService->__ns2__HelloWorld(NULL,&resp)==SOAP_OK){   
  13.   
  14.     RDebug::Printf(resp.HelloWorldResult);   
  15.   
  16. }   
  17.   
  18. }   
  19.   
  20. }   
  21.   
  22. break;  

case ECommand1:
{

//webservice



if(iService){

_ns1__HelloWorldResponse resp;

if(iService->__ns2__HelloWorld(NULL,&resp)==SOAP_OK){

        RDebug::Printf(resp.HelloWorldResult);

}

}

}

break;

真正的工作过程相当简单,就是先声明一个返回值_ns1_HelloWorldResponse类型的变量resp,调用iService的成员函数__ns2__HelloWorld即可。第一个参数是endpoint,可以为NULL,因为stub里已经有了,第二个参数就是resp的引用。

6.现在还要修改mmp文件,carbide是会自动帮你加上几个源文件的,接受即可。此外,mmp中更需要增加一个包含目录include/libc,以及几个链接库,如下:

SYSTEMINCLUDE /Epoc32/include/libc LIBRARY eexe.lib estlib.lib ecrt0.lib CAPABILITY ReadUserData NetworkServices nostrictdef

7.就这么容易,但是编译时,不行,出错了!报undefined _soap_outLONG64之类的错误!!

这时开始就折腾了我差不多一天。其实修改也挺简单的,打开那个stdsoap2.cpp,我们发现其实这个函数是有的,只是被一个宏 WITH_LEAN给关掉了,所以打开即可。但是打开宏,错误更多了,没办法,只能将这个函数定义前的宏注释掉看看,两个错变成三个错了,硬着头皮继续,在stdsoap2.cpp中注掉多个#ifndef WITH_LEAN的条件,终于不再报错了。

一切运行也就正常了。这个错误实在是够变态的了吧。

总结一下:

1.建议将stdsoap2.*弄到工程里去,因为改了源代码应该会与PC平台应用相冲突,当然假如你并不打算将gSOAP用于symbian以外的场合,可以仍放在gsoap目录下。

2.用gsoap最大的好处是不用自己去解析那个soap响应,也不用自己去封装soap请求了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值