工作需要用vc做一个webservice客户端,学习了一下gSoap。
gSoap下载地址
1. 下载后解压到本地硬盘,找到F:\Work Folder\gsoap-2.8\gsoap\bin\win32\目录
看到下面有wsdl2h.exe和soapcpp2.exe可执行文件
2. 运行D:\gsoap-2.8\gsoap\bin\win32\
3. 运行D:\gsoap-2.8\gsoap\bin\win32\
将生成以下文件
TermInfoHttpBinding.example.req.xml
TermInfoHttpBinding.example.res.xml
TermInfoHttpBinding.nsmap
soapC.cpp
soapClient.cpp
soapClientLib.cpp
soapBankingHttpTermInfoO
soapBankingHttpTermInfog
soapH.h
soapServer.cpp
soapServerLib.cpp
soapStub.h
将生成下面这些文件
- soapStub.h
// soap的存根文件,定义了ayandy.h里对应的远程调用模型 - soapC.c soapH.h
// soap的序列和反序列代码,它已经包含了soapStub.h,服务器端与客户端都要包含它 - soapClient.c soapClientLib.c
// 客户端代码,soapClientLib.c文件则只是简单地包含soapClient.c和soapC.c - soapServer.c soapServerLib.c
// 服务器端代码,soapServerLib.c文件则只是简单地包含soapServer.c和soapC.c - ServiceSoap.nsmap ServiceSoap12.nsmap
// 名空间定义,服务器端与客户端都要包含它 - soapServiceSoapProxy.h soapServiceSoap12Proxy.h
// 客户端的C++简单包装(如果头文件是纯C代码,这两个文件就不会生成)
综上所述
- 如果编写服务器端,项目里应该加入soapServerLib.c,代码里包含头文件soapH.h
- 如果编写客户端,项目里应该加入soapClientLib.c,代码里包含头文件SoapH.h(或xxxxProxy.h)
- 当然,还要加入gsoap库里的stdsoap2.cpp文件(如果是写C代码,则加入stdsoap2.c)
wsdl2h常用选项
- -o
文件名,指定输出头文件 - -n
名空间前缀 代替默认的ns - -c
产生纯C代码,否则是C++代码 - -s
不要使用STL代码 - -t
文件名,指定type map文件,默认为typemap.dat - -e
禁止为enum成员加上名空间前缀
type map文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写
soapcpp2常用选项
- -C
仅生成客户端代码 - -S 仅生成服务器端代码
- -L
不要产生soapClientLib.c和soapServerLib.c文件 - -c
产生纯C代码,否则是C++代码(与头文件有关) - -I
指定import路径 - -x
不要产生XML示例文件 - -i
生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
4. 拷贝以下文件到vc工程目录
soapC.cpp
soapH.h
soapClient.cpp
soapStub.h
BankingHttpBinding.nsmap
stdsoap2.h (在gsoap根目录)
stdsoap2.cpp (在gsoap根目录)
5. 将以上文件加入vc工程里,选择soapC.cpp, soapClient.cpp, stdsoap2.cpp右击鼠标Property ->c++->Precompiled Headers,选择Not using precompiled headers (预编译头)
准备工作完成,开始编写代码,下面是个简单的例子:
#include "stdafx.h"
#include <stdio.h>
#include "soapH.h"
#include "TermInfoHttpBinding.nsmap"
#include <iostream>
#include
using namespace std;
int main(int argc, char **argv)
string out=*addUserResponse.out;
printf("%s\n", out.c_str());
}