如何使用gSOAP将web服务转换成C++代码

问题1:怎样使用gSOAP生成代码
将gSOAP下载 下来之后有2个exe文件:

----------------------第一步-----------------------------
wsdl2h.exe是根据web服务的地址或者wsdl文件生成头文件的(之后的cpp文件都是基于的生成的这个头文件),命令是:
其中多个地址只需要以空格分隔就ok,执行命令以后,就会生成alldevices.h文件。
当需要处理中文的时候,需要加上标红的这段,typemap.dat可以修改提供的文件,也可以自己写下面的这1句,然后保存即可。
xsd__string = | std::wstring | wchar_t*
wsdl的相关参数如下:
命令解释:
wsdl2h -o 头文件名 WSDL文件名或URL
wsdl2h常用选项
-o 文件名,指定输出头文件 
-n 名空间前缀 代替默认的ns 
-c 产生纯C代码,否则是C++代码 
-s 不要使用STL代码 
-t 文件名,指定type map文件,默认为typemap.dat 
-e 禁止为enum成员加上名空间前缀 
----------------------第二步-----------------------------
使用soapcpp2.exe工具生成框架中的.h和.cpp文件
在执行命令之前,需要在同目录下复制过来以下文件,不然会报错

命令为:
soapcpp2 -i -C -x alldevices.h
soapcpp2常用选项:
-C 仅生成客户端代码 
-S 仅生成服务器端代码 
-L 不要产生soapClientLib.c和soapServerLib.c文件 
-c 产生纯C代码,否则是C++代码(与头文件有关) 
-I 指定import路径(视自己的解压包目录而定);
-x 不要产生XML示例文件 
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
在这里还需要将新预编译头去掉,如下:

工程采用Unicode字符集:

----------------------第三步-----------------------------
导入项目,在VC里新建项目,找到项目所在文件夹,将生成的soapC.cpp,soapH.h,soapStub.h,XXXWebServiceSoapProxy.cpp,XXXWebServiceSoapProxy.h,XXX.nsmap以及gSOAP系统文件stdsoap2.cpp和stdsoap2.h文件复制到该项目文件夹,同时加载到工程中。

问题2:代码怎样初始化
最终目的是调用web服务提供的函数,但是在此之前还有2个步骤:
1. 创建SOAP对象
cameraWSImplSoapBindingProxy camera;
//其中“cameraWSImplSoapBindingProxy ”是继承自SOAP类的。
2. 创建SOAP参数以及结果对象
ns1__GetProvinceCameras getprovincecamerap;//参数对象
ns1__GetProvinceCamerasResponse getprovincecamerar;//结果对象
getprovincecamerap有很多参数,需要对它们进行赋值,例如:
getprovincecamerap.arg0 = lic;
每一个调用的函数都会有这2个参数,例如:
function(getprovincecamerap,getprovincecamerar),调用函数得出的结果就存于getprovincecamerar中了。
问题3:json解析
对于有些web服务得出的结果是字符串还好,有些web服务得出的结果的格式是json的,这就需要解析json。
可以直接使用现有工具jsoncpp实现解析。
Step1:从网址 https://github.com/open-source-parsers/jsoncpp 下载jsoncpp文件夹,编译得到静态lib库文件,将其拷到项目文件夹下。
Step2:在代码中写上
#pragma comment(lib,"./lib/json_vc71_libmt.lib")//lib路径自行修改即可调用。
Step3:解析:
string cc = UnicodeToANSI(allcameras);//将获取到的内容转成string类型
Json::Reader reader; //定义读取器
Json::Value root;//根元素
if (!reader.parse(cc, root, false)) //进行解析,成功返回0
{
return -1;
}
int size = root.size();
std::list<Camera *> mycamera;
for (int i=0; i<size; ++i)
{
Camera * Ctemp = new Camera;
Ctemp->cameraId = root[i]["cameraId"].asInt();//使用root操作json对象

细节编程问题
1. list使用
std::list<Type*> mycamera;//定义某种类型的链表
可以调用很多函数,比如:mycamera.push_back(Ctemp);
读取链表需要定义迭代器:
list<Prodevice *>::iterator ite;
for(ite = myprodev.begin();ite != myprodev.end(); ite++)
{
string id = (*ite)->institutionId;
......各种操作
2. 文件读写
最后需要把获取到的所有摄像头信息存到文件里去,使用的是<fstream>头文件。
ofstream outfile; //定义文件处理对象
outfile.open("camerasinfo.txt");//打开文件
outfile<<"局站ID:"<<id<<" 摄像头个数:"<<subsum<<endl;//写入文件

附:重要转换函数
---------------------- char * 转 wchar_t * -----------------------------
wchar_t* c2w(char *str)
{
int length = strlen(str)+1;
wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
memset(t,0,length*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
return t;
}
----------------------- Unicode转ANSI ---------------------------------
string UnicodeToANSI(const wstring& str)
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,
0,str.c_str(),-1,NULL,
0,NULL,NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_ACP,
0,str.c_str(),-1,pElementText,
iTextLen,NULL,NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}

gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。   gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。   gSOAP使编写web服务的工作最小化了。gSOAP编译器生成SOAP代码来序列化或反序列化C/C++的数据结构。gSOAP包含一个WSDL生成器,用它   来为你的web服务生成web服务的解释。gSOAP的解释器及导入器可以使用户不需要分析web服务的细节就可以实现一个客户端或服务端程序。   下面是gSOAP的一些特点:   ×gSOAP编译器可以根据用户定义的C和C++数据结构自动生成符合SOAP的实例化代码。   ×gSOAP支持WSDL 1.1, SOAP 1.1, SOAP 1.2, SOAP RPC 编码方式以及 literal/document 方式.   ×gSOAP是少数完全支持SOAP1.1 RPC编码功能的工具包,包括多维数组及动态类型。比如,一个包含一个基类参数的远程方法可以接收客户端   传来的子类实例。子类实例通过动态绑定技术来保持一致性。   ×gSOAP 支持 MIME (SwA) 和 DIME 附件包。   ×gSOAP是唯一支持DIME附件传输的工具包。它允许你在保证XML可用性的同时能够以最快的方式(流方式)传递近乎无大小限制的二进制数据   。   ×gSOAP 支持 SOAP-over-UDP。   ×gSOAP 支持 IPv4 and IPv6.   ×gSOAP 支持 Zlib deflate and gzip compression(for HTTP, TCP/IP, and XML file storage)。   ×gSOAP 支持 SSL (HTTPS)。   ×gSOAP 支持 HTTP/1.0, HTTP/1.1 保持连接, 分块传输及基本验证。   ×gSOAP 支持 SOAP 单向消息。   ×gSOAP 包含一个 WSDL 生成器,便于web服务的发布。   ×gSOAP 包含一个WSDL解析器(将WSDL转换为gSOAP头文件),可以自动化用户客户端及服务端的开发。   ×生成可以单独运行的web服务及客户端程序。   ×因为只需要很少内存空间,所以可以运行在类似Palm OS, Symbian, Pocket PC的小型设备中。   ×适用于以C或C++开发的web服务中。   ×跨平台:Windows, Unix, Linux, Mac OS X, Pocket PC, Palm OS, Symbian等。   ×支持序列化程序中的本地化C/C++数据结构。   ×可以使用输入和输出缓冲区来提高效率,但是不用完全消息缓冲来确定HTTP消息的长度。取而代之的是一个三相序列化方法。这样,像64位   编码的图像就可以在小内存设备(如PDA)中以DIME附件或其他方式传输。   ×支持C++单继承,动态绑定,重载,指针结构(列表、树、图、循环图,定长数组,动态数组,枚举,64位2进制编码及16进制编码)。   ×不需要重写现有的C/C++应用。但是,不能用unions,指针和空指针来作为远程方法调用参数的数据结构中元素。   ×三相编组:1)分析指针,引用,循环数据结构;2)确定HTTP消息长度;3)将数据序列化位SOAP1.1编码方式或用户定义的数据编码方式。   ×双相编组:1)SOAP解释及编码;2)分解“forward”指针(例如:分解SOAP中的href属性)。   ×完整可定制的SOAP错误处理机制。   ×可定制的SOAP消息头处理机制,可以用来保持状态信息   2 gSoap2.2版与gSOAP 2.1版(或以前版本)的不同   如果你是从2.1版升级到2.2或以后版本,请注意这些变化。   为了能够分离传输、内容编码、映射中的接收/发送设置,改变了运行时选项及标志。这些标志分布再四个类中:传输(IO),内容编码(ENC   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值