查看文章 |
1 什么是gSoap gSoap不是一个语言,不是一个开发库,不是一个平台。 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服务的细节就可以实现一个客户端或服务端程序。 2 下载和安装从 SourceForge gSOAP project site下载gSoap的最新版本。然后解压到一个指定目录即可。比如我们解压到" E:\gsoap_2.7.10\",为以后使用方便,我们在机器的环境变量里设置一下PATH= " E:\gsoap_2.7.10\gsoap\bin\win32"。 设置这个变量后,我们就可以在任何地方使用wsdl2h和soapcpp2来产生我们所需要的类文件。 3 使用gSoap创建WS调用客户端程序3.1 使用gSoap生成代码首先,需要把wsdl文件放置在可以访问的路径,gSoap支持直接http方式访问,但这样每次生成,都得依赖这个Webserveice启动,不是很方便。因此,建议和在客户端代码并列的目录下,建立一个wsdl的子目录,并把所需的wsdl文件拷贝进去。 如下结构: GMP_src--|--CCTVCA_Demo 在wsdl里,按服务分类再建立自己的子目录,公共的schema文件放在wsdl目录下。 gPluginCCTVSync是客户端程序的源码所在目录,在此目录下,建立一个gSoapComplier.bat文件,内容如下: wsdl2h -o BCAndExistBroadcast.h ../wsdl/BCAndExistBroadcast.wsdl 运行这个文件,即可生成构建客户端所需的.h和.cpp文件。 把生成的soap开头的.h和.cpp文件加入到工程中,并且,对.cpp文件进行设置,让它不使用预编译头。如下图:
再从E:\gsoap_2.7.10\gsoap\上拷贝文件stdsoap2.h和stdsoap2.cpp,并把它们加到vc工程里,设置stdsoap2.cpp为"不使用预编译头"。 编译工程,即可编译通过。 3.2 调用WebService如下代码,BroadcastBinding是gSoap给我们生成的类,我们只要直接实例化并调用即可。 同它的endpoint属性,可以指定要调用的webservice的实际地址。
#include "soapBroadcastBindingProxy.h" #include "BroadcastBinding.nsmap" … BroadcastBinding service; service.endpoint= T2A(m_SyncSetting.m_strEndPoint);
ns3__QueryPrepareStatusRequestType request; ns1__queryPrepareStatusResponse respond;
DWORD dwResult= InitialPrepareQueryRequestType(service.soap,request); if (dwResult != DYMC_OK) return dwResult;
(*request.FileName)= T2A(pClip->strClipFile); (*request.ClipID)= T2A(pClip->strClipID); (*request.ProgramCode)= T2A(pClip->strProgCode); request.IsNeedAVInfo= true;
if (service.ns1__queryPrepareStatus(&request, respond) == SOAP_OK) { if (respond.output->IsExist== TRUE) { return DYMC_OK; }else { return DYMC_ERROR_NOTFOUNTD; } } return DY_GMP_SAPROTOCAL_NOTCONECT;
|

