C++ gsoap多接口导出步骤

方法三:使用gsoap.exe生成文件
由于未知原因,在使用第一种方法时,第一步生成头文件就失败,无法解析wadl的内容,报error.因此本人在网上搜罗大牛的博客查询资料借鉴整理验证,集前人所得才可最终成功.此方法稍微复杂一点点点点,各位看官请耐心.

1.使用wsdl2生成头文件
注意:
如果说传输的内容中含有中文,则需要增加一个bat文件,把传输类型由std::string转为wchar_t*,由宽字符传输,则可以解决乱码问题.刚开始由于没有添加处理文件导致后续接收到的中文乱码,折腾了半天,希望大家少走弯路.
bat文件(用txt文本保存如下文件,再修改后缀为bat即可)中一句话:

xsd__string = | std::wstring | wchar_t*

2.地址最后增加?wsdl, 右击另存为.wsdl文件
在gsoap-2.8\gsoap\bin\win32目录下,首先使用wsdl2.exe生成头文件:

wsdl2h -s -t wsmap.dat WeatherWS.wsdl//(可自动生成.h文件)
//或者不生成wsdl文件,直接使用wsdl的网址也可以生成
wsdl2h -s -t wsmap.dat http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl//(需要手动创建.h文件)

对于需要导出多份接口的情况,需单独运行命令行,不可合并生成
例如:

wsdl2h -s -t wsmap.dat 111.wsdl
wsdl2h -s -t wsmap.dat 222.wsdl

3.使用soapcpp2生成系列文件
soapcpp2 -i -C -x -L -psoapNewProduce .\NewProduceWebService.h -I C:\Projects\3PartyLibrary\gsoap-2.8\gsoap\import
对于需要导出多份接口的情况,需增加-pname来生成不同soapC,soapH,soapStu等文件,不然会在执行上诉命令导出第二套接口时覆盖前一个接口文件,例如:-psoaLogin,则生成soapLoginH,soapLoginStu等文件
soapcpp2常用选项
-C 仅生成客户端代码
-S 仅生成服务器端代码
-L 不要产生soapClientLib.c和soapServerLib.c文件
-c 产生纯C代码,否则是C++代码(与头文件有关)
-I 指定import路径
-x 不要产生XML示例文件
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
在这里插入图片描述
执行成功后会生成红框中的文件
在这里插入图片描述
3.使用实例
1.加载入项目中
把上图红框中的五个文件(除了soapClientLib.cpp),以及gsoap下的stdsoap2.h和stdsoap2.cpp两个文件添加到项目中.
在项目中添加这七个文件后,cpp文件需要修改属性:在项目中的cpp上右键属性,选择不使用预编译头.

2.调用流程
首先需要添加头文件:
#include “soapH.h”
#include “MobileCodeWSSoap.nsmap”

实例如下:

#include “stdafx.h”
#include
#include “soapH.h”
#include “MobileCodeWSSoap.nsmap”
#include
using namespace std;

int main ()
{
// SOAP的客户端
struct soap m_oSoap;
// WebService调用对象
class _ns1__getMobileCodeInfo getMobileCodeObject;
// WebService返回对象
class _ns1__getMobileCodeInfoResponse getMobileCodeResponseObject;
// SOAP初始化
soap_init(&m_oSoap);
// 调用函数的参数赋值
char strName[24] = {0};
sprintf(strName,“15742451354”);
wchar_t *wstrName = A2W(strName);
getMobileCodeObject.mobileCode = wstrName;
/*如果生成头文件时没有修改类型,那么用如下方式赋值,接收的类型当然也是string:
std::string strName = “15742451354”;
getMobileCodeObject.mobileCode = strName;
*/

// 发送WebService请求,并获得返回结果
int nResult = soap_call___ns1__getMobileCodeInfo(&m_oSoap,NULL,NULL,&getMobileCodeObject,getMobileCodeResponseObject);
// 操作成功
if(SOAP_OK == nResult)
{
	// 输出返回结果
	wchar_t* strResult = getMobileCodeResponseObject.getMobileCodeInfoResult;
	wcout.imbue(locale("chs"));
	wcout<<"wcout:"<<strResult<<endl;
}
/// 关闭SOAP
soap_destroy(&m_oSoap);
soap_end(&m_oSoap);
soap_done(&m_oSoap);

system("pause");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值