C++调用webservice服务生成客户端代码-gsoap

 本文在原创上面稍作修改

  1. Java端创建服务

  1. 输入网址,生成wsdl文件
  2. 使用wsdl2.exe生成头文件

注意:

如果说传输的内容中含有中文,则需要增加一个bat文件,把传输类型由std::string转为wchar_t*,由宽字符传输,则可以解决乱码问题.刚开始由于没有添加处理文件导致后续接收到的中文乱码,折腾了半天,希望大家少走弯路.

bat文件(用txt文本保存如下文件,再修改后缀为bat即可)中一句话:

xsd__string = | std::wstring | wchar_t*

  • 根据wsdl文件生成头文件

先将目录切换到指定目录,为后续生成C++相关文件做准备

然后输入命令

 

命令执行后,会生成头文件

  • 根据wsdl的网址生成头文件

 

  • 中文乱码添加bat

 

 

  1. 根据soapcpp2.exe生成系列文件

soapcpp2常用选项

-C 仅生成客户端代码

-S 仅生成服务器端代码

-L 不要产生soapClientLib.c和soapServerLib.c文件

-c 产生纯C代码,否则是C++代码(与头文件有关)

-I 指定import路径

-x 不要产生XML示例文件

-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)

原始目录:

执行命令(注意大小写):

 

生成相关文件

 

  1. 程序执行

创建项目

 

 

添加文件,红色的文件复制到你创建项目目录下

 

 

 

你的项目添加效果如下:

代码如下:

#include "stdafx.h"
#include "soapH.h"
#include "PLMWebserviceImpServiceSoapBinding.nsmap"
using namespace std;
wchar_t * char2wchar(const char* cchar);
char * wchar2char(const wchar_t* wchar );
int _tmain(int argc, _TCHAR* argv[])
{
	// SOAP的客户端
	soap m_oSoap;
	class ns1__sayHello sayhello;
	class ns1__sayHelloResponse sayhelloReponse;
	soap_init(&m_oSoap);
	string a = "asds";
	wchar_t *wstrName = char2wchar(a.c_str());
	sayhello.arg0 = wstrName;
	//int result = soap_call___ns1__sayHello(&m_oSoap,NULL,NULL,&sayhello,sayhelloReponse);
	int result = soap_call___ns1__sayHello(&m_oSoap,"http://localhost:8080/CXFTest/services/PLMService",NULL,&sayhello,sayhelloReponse);
	if(SOAP_OK == result)
	{
		// 输出返回结果
		wchar_t* strResult = sayhelloReponse.return_;
		//wcout.imbue(locale("chs"));
		char *result_s = wchar2char(strResult);
		cout<<"wcout:"<<result_s<<endl;
		delete result_s;
	}
	delete wstrName;
	/// 关闭SOAP
	soap_destroy(&m_oSoap);
	soap_end(&m_oSoap);
	soap_done(&m_oSoap);
	return 0;
}
wchar_t * char2wchar(const char* cchar) 
{   
	wchar_t *m_wchar;
	int len = MultiByteToWideChar( CP_ACP ,0,cchar ,strlen( cchar), NULL,0);
	m_wchar= new wchar_t[len+1]; 
	MultiByteToWideChar( CP_ACP ,0,cchar,strlen( cchar),m_wchar,len); 
	m_wchar[len]= '\0' ;   
	return m_wchar; 
}
char * wchar2char(const wchar_t* wchar )
{
	char * m_char;  
	int len= WideCharToMultiByte( CP_ACP ,0,wchar ,wcslen( wchar ), NULL,0, NULL ,NULL ); 
	m_char= new char[len+1];
	WideCharToMultiByte( CP_ACP ,0,wchar ,wcslen( wchar ),m_char,len, NULL ,NULL ); 
	m_char[len]= '\0';
	return m_char; 
}

调用效果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值