gsoap 访问c# webservice 返回数据集的示例小结

服务器端,尽量不要返回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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值