查看文章
 
gSoap介绍(上)
2009-09-16 11:15

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
              |---CCTVCommonDef.xsd
              |---EMB

在wsdl里,按服务分类再建立自己的子目录,公共的schema文件放在wsdl目录下。

gPluginCCTVSync是客户端程序的源码所在目录,在此目录下,建立一个gSoapComplier.bat文件,内容如下:

wsdl2h -o BCAndExistBroadcast.h ../wsdl/BCAndExistBroadcast.wsdl
soapcpp2 -C -IE:\gsoap_2.7.10\gsoap\import BCAndExistBroadcast.h
pause

运行这个文件,即可生成构建客户端所需的.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;


类别:vc 网络编程||添加到搜藏 |分享到i贴吧|浏览(1348)|评论 (0)
 
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu