分类: 其他平台
2013-07-05 18:04:29
使用gSOAP生成代码架构
在使用gSOAP之前首先要了解一下它,那么它是在什么情况下产生的呢?有下面一个特定背景:
在向Web Service发送的SOAP请求中,Body元素中的字段需与WSDL中数据类型的相符合。在构建SOAP的过程中,必须从WSDL文件中获取并映射这一种对应关系。然而这样一个对应过程将是充满了重复性和机械性的,为了避免不必要的人工差错以及节约开发时间,一个名为gSOAP的编译工具应运而生。
gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。通过将WSDL文件解析序列化为C/C++文件,最小化了Web Service的开发过程。
其中有一个WEB SERVICE的开发流程,可以看到gSOAP在整个流程中的地位:
接下来我们来看下gSOAP中两个重要工具的使用:
wsdl2h.exe的作用是根据WSDL生成C/C++风格的头文件
soapcpp2.exe的作用是根据头文件自动生成调用远程 SOAP服务的客户端代码(称为存根:Stub)和提供SOAP服务的框架代码(称为框架:Skeleton),另外它也能从头文件生成WSDL文件。
(1)、从WSDL中产生头文件
用法:wsdl2h.exe –flag –o 头文件名 WSDL文件名或URI
Flag常用选项:
· -o 文件名,指定输出头文件
· -n 名空间前缀 代替默认的ns
· -c 产生纯C代码,否则是C++代码
· -s 不要使用STL代码
· -t 文件名,指定type map文件,默认为typemap.dat
· -e 禁止为enum成员加上名空间前缀
(2)、从头文件生成存根和框架源文件
Soapcpp2 –flag 头文件
Flag常用选项:
· -C 仅生成客户端代码
· -S 仅生成服务器端代码
· -L 不要产生soapClientLib.c和soapServerLib.c文件
· -c 产生纯C代码,否则是C++代码(与头文件有关)
· -I 指定import路径(见上文)
· -x 不要产生XML示例文件
· -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
以上都是gSOAP的使用方法,下面针对具体的wsdl生成存根和框架源文件的步骤:
对于在windows下使用gSOAP的时候要注意,使用的是gsoap-2.8\gsoap\bin\win32目录下的两个可执行命令,同时为了简单起见,建议在wsdl目录下建立两个批处理命令gen-h.bat和gen-c.bat,,编辑批处理gen-h.bat,添加如下命令:wsdl2h.exe -s -c -g -t .\WS-typemap.dat -o onvif.h analytics.wsdl analyticsdevice.wsdl devicemgmt.wsdl display.wsdl event.wsdl imaging.wsdl media.wsdl ptz.wsdl receiver.wsdl recording.wsdl remotediscovery.wsdl replay.wsdl search.wsdl,其中后边的wsdl文件也可以是wsdl文件所在的URI地址。编辑批处理命令gen-c.bat,添加代码:soapcpp2.exe -2 -L -c onvif.h -d..\ -IF:\OpenSource\tools\gSOAP\gsoap-2.8\gsoap\import;F:\OpenSource\tools\gSOAP\gsoap-2.8\gsoap:其中-I指定的是import的路径,需要根据自己的gsoap-2.8存放路径为准。同时要想生成成功PC机需要可以联网。