gsoap一键生成C++代理类及其调用

echo 生成头文件Service.h
wsdl2h.exe -o Service.h http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL

echo 生成其它soap文件支持
soapcpp2.exe -I../../import -x -L -i -C Service.h -1

del OutFile /s /Q
MD OutFile
echo 拷贝文件
copy ..\..\stdsoap2.h OutFile\ 
copy ..\..\stdsoap2.cpp OutFile\ 
copy *.h OutFile\ 
copy *.cpp OutFile\ 
copy *.nsmap OutFile\

echo 删除临时文件
del /f/q .\*.h
del /f/q .\*.cpp
del /f/q .\*.nsmap

pause
wsdl2h.exe参数常用选项
-o filename.h   将wsdl转化为filename.h头文件
-n name         使用name命名空间前缀代替默认的前缀ns
-c              产生纯C代码,否则是C++代码
-s              不要使用STL代码
-t filename.dat 使用filename.dat代替默认的typemap.dat文件
-e              禁止为enum成员加上名空间前缀

soapcpp2.exe参数常用选项
-C              仅生成客户端代码
-S              仅生成服务器端代码
-L              不要产生soapClientLib.c和soapServerLib.c文件
-c              产生纯C代码,否则是C++代码(与头文件有关)
-I              指定import路径(见上文)
-x              不要产生XML示例文件
-i              生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)
-p name         修改文件名前缀,代替soap
-q name         指定代理类和对象使用的名空间name,包含文件名前缀
  • 双击运行start.bat,执行完成后会在当前目录生成OutFile文件夹,里面的所有文件即是我们需要加入到VS工程中的文件

  • 以Visual Studio 2008进行举例说明,调用该服务的getSupportCity接口,入参byProvinceName输入:湖北,获取返回结果
// TestWeatherWebService.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "TestWeatherWebService.h"
#include "WeatherWebServiceSoap.nsmap"
#include "soapWeatherWebServiceSoapProxy.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

string UTF8ToGBK(const std::string& strUTF8)  
{  
	int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);  
	unsigned short * wszGBK = new unsigned short[len + 1];  
	memset(wszGBK, 0, len * 2 + 2);  
	MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8.c_str(), -1, (LPWSTR)wszGBK, len);  

	len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL);  
	char *szGBK = new char[len + 1];  
	memset(szGBK, 0, len + 1);  
	WideCharToMultiByte(CP_ACP,0, (LPCWSTR)wszGBK, -1, szGBK, len, NULL, NULL);  
	std::string strTemp(szGBK);  
	delete [] szGBK;  
	szGBK = NULL;  
	delete [] wszGBK;  
	wszGBK = NULL;  
	return strTemp;  
}  

string GBKToUTF8(const std::string& strGBK)  
{  
	string strOutUTF8 = "";  
	WCHAR * str1;  
	int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);  
	str1 = new WCHAR[n];  
	MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);  
	n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);  
	char * str2 = new char[n];  
	WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);  
	strOutUTF8 = str2;  
	delete [] str1;  
	str1 = NULL;  
	delete [] str2;  
	str2 = NULL;  
	return strOutUTF8;  
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// 初始化 MFC 并在失败时显示错误
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: 更改错误代码以符合您的需要
		_tprintf(_T("错误: MFC 初始化失败\n"));
		nRetCode = 1;
	}
	else
	{
		// TODO: 在此处为应用程序的行为编写代码。
	}

	WeatherWebServiceSoapProxy service("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx", SOAP_C_UTFSTRING);
	service.connect_timeout = 10;//连接超时时间,正值以秒为单位,负值以微秒为单位
	service.send_timeout = 10;//发送超时时间,正值以秒为单位,负值以微秒为单位
	service.recv_timeout = 10;//接收超时时间,正值以秒为单位,负值以微秒为单位
	//service.accept_timeout;
	//service.transfer_timeout;

	_ns1__getSupportCity input;
	_ns1__getSupportCityResponse output;

	string strProvinceName = "湖北";
	cout << "input:" << strProvinceName << endl;

	string strUtfProvinceName = GBKToUTF8(strProvinceName);
	input.byProvinceName = &strUtfProvinceName;
	int soap = service.getSupportCity(&input, output);
	if (SOAP_OK == soap && NULL != output.getSupportCityResult)
	{
		for (int i = 0; i < output.getSupportCityResult->string.size(); i++)
		{
			cout << "output:" << UTF8ToGBK(output.getSupportCityResult->string.at(i)) << endl;
		}
	}
	else
	{
		cout << "error:"<<service.error<<",faultcode:"<<*soap_faultcode(&service)<<",faultstr:"<<*soap_faultstring(&service) << endl;
	}

	system("pause");
	return nRetCode;
}
  • 工程部署:

  • 执行结果:

wsdl2h链接多个soap服务

wsdl2h.exe -nName -o Service.h http://127.0.0.1:8808/1?wsdl http://127.0.0.1:8808/2?wsdl

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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服务的细节就可以实现一个客户端或服务端程序。   下面是gSOAP的一些特点:   ×gSOAP编译器可以根据用户定义的C和C++数据结构自动生成符合SOAP的实例化代码。   ×gSOAP支持WSDL 1.1, SOAP 1.1, SOAP 1.2, SOAP RPC 编码方式以及 literal/document 方式.   ×gSOAP是少数完全支持SOAP1.1 RPC编码功能的工具包,包括多维数组及动态型。比如,一个包含一个基参数的远程方法可以接收客户端   传来的子实例。子实例通过动态绑定技术来保持一致性。   ×gSOAP 支持 MIME (SwA) 和 DIME 附件包。   ×gSOAP是唯一支持DIME附件传输的工具包。它允许你在保证XML可用性的同时能够以最快的方式(流方式)传递近乎无大小限制的二进制数据   。   ×gSOAP 支持 SOAP-over-UDP。   ×gSOAP 支持 IPv4 and IPv6.   ×gSOAP 支持 Zlib deflate and gzip compression(for HTTP, TCP/IP, and XML file storage)。   ×gSOAP 支持 SSL (HTTPS)。   ×gSOAP 支持 HTTP/1.0, HTTP/1.1 保持连接, 分块传输及基本验证。   ×gSOAP 支持 SOAP 单向消息。   ×gSOAP 包含一个 WSDL 生成器,便于web服务的发布。   ×gSOAP 包含一个WSDL解析器(将WSDL转换为gSOAP头文件),可以自动化用户客户端及服务端的开发。   ×生成可以单独运行的web服务及客户端程序。   ×因为只需要很少内存空间,所以可以运行在似Palm OS, Symbian, Pocket PC的小型设备中。   ×适用于以C或C++开发的web服务中。   ×跨平台:Windows, Unix, Linux, Mac OS X, Pocket PC, Palm OS, Symbian等。   ×支持序列化程序中的本地化C/C++数据结构。   ×可以使用输入和输出缓冲区来提高效率,但是不用完全消息缓冲来确定HTTP消息的长度。取而代之的是一个三相序列化方法。这样,像64位   编码的图像就可以在小内存设备(如PDA)中以DIME附件或其他方式传输。   ×支持C++单继承,动态绑定,重载,指针结构(列表、树、图、循环图,定长数组,动态数组,枚举,64位2进制编码及16进制编码)。   ×不需要重写现有的C/C++应用。但是,不能用unions,指针和空指针来作为远程方法调用参数的数据结构中元素。   ×三相编组:1)分析指针,引用,循环数据结构;2)确定HTTP消息长度;3)将数据序列化位SOAP1.1编码方式或用户定义的数据编码方式。   ×双相编组:1)SOAP解释及编码;2)分解“forward”指针(例如:分解SOAP中的href属性)。   ×完整可定制的SOAP错误处理机制。   ×可定制的SOAP消息头处理机制,可以用来保持状态信息   2 gSoap2.2版与gSOAP 2.1版(或以前版本)的不同   如果你是从2.1版升级到2.2或以后版本,请注意这些变化。   为了能够分离传输、内容编码、映射中的接收/发送设置,改变了运行时选项及标志。这些标志分布再四个中:传输(IO),内容编码(ENC   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值