服务器端,尽量不要返回DATASET,这样在GSOAP中自动生成的返回对象是一个CHAR* 的列表,不易操作。最好是使用对象列表返回,GSOAP可以根据返回的对象生成对应的C++对象,方便使用。
下载完GSOAP后,在工作目录新建一个临时目录,用于生成服务器端对应的客户端类库,将GSOAP目录中的wsdl2h.exe和soapcpp2.exe复制到临时目录中,将typemap.dat也复制过去,并在其最后一行加入xsd__string = | std::wstring | wchar_t*,资料说是可以解决中文乱码的问题,测试时未发现还有此功能。
在DOS命令窗口进入临时工作目录,打入命令:
wsdl2h -o test.h -t typemap.dat http://localhost/webtools/commontools.asmx?WSDL
这将根据服务器的WSDL文件生成一个头文件,
用到的两个参数含义如下:
-t typemap.dat 根据typemap.dat规则转换数据类型
-o 生成test.h头文件
再运行命令:
soapcpp2 -i -C -x test.h
将生成相关的文件
-C 只生成客户端代码
-i 直接使用C++包装类
-x 不生成相关的xml
这时临时目录中会多几个文件,除掉刚才复制进去的几个文件外,其他的全部选择。
在VS2010中新建空白工程,在工程属性-链接器-输入-附加依赖项中加入wsock32.lib。
在资源管理器中打开新建工程目录,将刚才复制的生成的文件粘贴进工程目录中,在工程里添加现有文件,选择刚粘贴进去的几项,
同样的操作,将GSOAP安装目录中的stdsoap2.cpp,stdsoap2.h加入工程。
在工程中加入主文件main.cpp
加入引用
#include <iostream>
#include <string>
#include <tchar.h>
#include "soapcommontoolsSoapProxy.h"
#include "commontoolsSoap.nsmap"
using namespace std;
在网上找的两个方法,用于UTF8和STRING的转换,挺好用的(引用地址:http://www.cppprog.com/2009/0723/138_2.html):
// 宽 字符转UTF8
string EncodeUtf8(wstring in)
{
string s(in.length()*3+1,' ');
size_t len = ::WideCharToMultiByte(CP_UTF8, 0,in.c_str(), in.length(),&s[0], s.length(),NULL, NULL);
s.resize(len);
return s;
}
// UTF8 转宽字符
wstring DecodeUtf8(string in)
{
wstring s(in.length(), _T(' '));
size_t len = ::MultiByteToWideChar(CP_UTF8, 0,in.c_str(), in.length(),&s[0], s.length());
s.resize(len);
return s;
}
然后就是main方法了
int main()
{
struct _ns1__hello hello;
struct _ns1__helloResponse helloRes;
commontoolsSoapProxy cs(SOAP_C_UTFSTRING);
if(cs.hello(&hello,&helloRes)==SOAP_OK)
{
wcout.imbue( std::locale("chs") );
wcout<<DecodeUtf8(*helloRes.helloResult)<<endl;
}
else
{
printf("fail/n");
}
struct _ns1__ListProvince list;
struct _ns1__ListProvinceResponse listRes;
if(cs.ListProvince(&list,&listRes)==SOAP_OK)
{
wcout.imbue( std::locale("chs") );
ns1__ArrayOfBaseBigClass* lst=listRes.ListProvinceResult;
vector<ns1__BaseBigClass*> itemlist = lst->BaseBigClass;
vector<ns1__BaseBigClass*>::iterator itor;
for(itor=itemlist.begin();itor!=itemlist.end();itor++)
{
ns1__BaseBigClass* item=*itor;
wcout<<item->ID<<DecodeUtf8(*item->Name) <<endl;
}
}
else
{
wcout<<"list fail;"<<endl;
}
system("pause");
return 0;
}