用gSOAP更简单地实现Web Services Client
2008-11-03 17:36
232 查看
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?
// 此处省略
#include "soapPServiceSoapProxy.h"
// FORWARD DECLARATIONS
class CHelloWSTwoAppView;
class PServiceSoap;
//此处省略
private:
CHelloWSTwoAppView* iAppView;
PServiceSoap * iService;
//此处省略
view plaincopy to clipboardprint?
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请求了
具体使用方法不多说,因为网上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?
// 此处省略
#include "soapPServiceSoapProxy.h"
// FORWARD DECLARATIONS
class CHelloWSTwoAppView;
class PServiceSoap;
//此处省略
private:
CHelloWSTwoAppView* iAppView;
PServiceSoap * iService;
//此处省略
// 此处省略 #include "soapPServiceSoapProxy.h" // FORWARD DECLARATIONS class CHelloWSTwoAppView; class PServiceSoap; //此处省略 private: CHelloWSTwoAppView* iAppView; PServiceSoap * iService; //此处省略引入那个代理头文件,然后加一个PServiceSoap类型的成员变量iService。接着修改cpp文件,在构造时new它,在析构时delete它即可。
view plaincopy to clipboardprint?
case ECommand1:
{
//webservice
if(iService){
_ns1__HelloWorldResponse resp;
if(iService->__ns2__HelloWorld(NULL,&resp)==SOAP_OK){
RDebug::Printf(resp.HelloWorldResult);
}
}
}
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请求了
相关文章推荐
- WebClient.DownloadFileAsync实现下载网络数据-简单的下载软件
- Symbian学习笔记(20) - 用gSOAP更简单地实现Web Services Client
- gsoap实现简单web service应…
- 用gSOAP更简单地实现Web Services Client
- 用gSOAP更简单地实现Web Services Client(转)
- web 纯 javascript 的MVC 实现的简单实践
- Web开发之html2canvas 实现纯JS网页截图简单例子
- javaWeb 简单注册登录(含数据库连接) -- (三) 实现用户注册请求的响应
- C#实现简单WEB服务器
- Java多线程 Web服务器简单实现
- C#通过WebClient/HttpWebRequest实现http的post/get方法
- XP下解决“system.web.services.protocols.soapexception:服务器无法处理请求。…〉system.exception:system.data.oracleclient 需要oracle客户端软件8.1.7或更高版本。
- SpringMVC整合fastdfs-client-java实现web文件上传下载
- treeview--- web方式下权限分配简单实现
- 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert
- 关于类似于电信弹出广告(push业务),使用ROS与简单web服务器实现
- Java实现简单的server/client回显功能
- 【APACHE MINA2.0开发之一】搭建APACHE MINA框架并实现SERVER与CLIENT端的简单消息传递!
- java实现简单web服务器(分析+源代码)
- Android 最简单动画实现(imageView,webview的进入和退出)