微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GSoap 调用webservice的一些注意事项

1.根据wsdl生成.h文件

wsdl2h -s -o PhoneQuery.h http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

2.根据生成的.h文件生成C++代码

soapcpp2 -C -L -i -I E:\gSOAP\gsoap-2.8\gsoap\import -xPhoneQuery.h

其中红色部分是可变的,这个介绍的就比较多的,如果在第2步生成错误,比如缺少stlvector.h或者soap12.h的话,在第一步生成的.h文件中,注释掉相应的import语句


3把生成文件添加到你的vs2008的工程中,分为两部分进行讲解:

第一:Console application( 不是1.2操作的结果,这个部分是单独的)


如图中的标号:

1,3,以及还有nsmap后缀的文件,为第2步生成代码

3,4为gsoap解压目录中的代码

其中3,4需要设置添加#include "stdafx.h"的一用

另外在testsoap1.cpp中需要添加如下引用:

#include "qqOnlineWebServiceSoap.nsmap"  
#include "soapqqOnlineWebServiceSoapProxy.h"

第二:MFC Application


如图添加1,2步骤中生成文件和gsoap中的2,4标号的文件

需要注意的是:

需要在引用proxy类的文件

PhoneQueryDlg.h中添加#include "soapMobileCodeWSSoapProxy.h"的引用。

PhoneQueryDlg.cpp中添加#include "MobileCodeWSSoap.nsmap"的引用。


另外需要注意的是:MFC Application 的编码字符集,而一般的webservice采用的都是utf-8的字符集,因此在传入的时候需要把mfc applicatoin的字符转化为utf-8的格式传入。得到webservice的返回值后,把字符转化为相应的编码字符集即可。

这里有关字符转化的函数有两个:

wchar_t* CPhoneQueryDlg::GetUNICODEfromUTF(const char* des)
{
	int wcslen = ::MultiBytetoWideChar(CP_UTF8,NULL,des,strlen(des),0);
	//分配空间要给'\0'留个空间,MultiBytetoWideChar不会给'\0'空间 
	 wchar_t* result = new wchar_t[wcslen + 1];
	//转换
	::MultiBytetoWideChar(CP_UTF8,result,wcslen);
	//最后加上'\0'
	result[wcslen] = '\0';
	return result;
}

char* CPhoneQueryDlg::CStringtochar(CString des)
{
#ifdef _UNICODE 
	// Unicode编码
	//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
	 int n = des.GetLength();
	//获取宽字节字符的大小,大小是按字节计算的
	int len = WideCharToMultiByte(CP_UTF8,-1,NULL);

	//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
	char * result = new char[len+1];   //以字节为单位

	//宽字节编码转换成多字节编码
	WideCharToMultiByte(CP_UTF8,len,NULL);
	return result;
#else
	// 多字节编码 muti_byte
	return (LPSTR)(LPCTSTR)des;
#endif	
}

最后希望这边文章对初学者有点帮助,任何问题请联系我。

by the way 写这篇文章结束到我接触gsoap不到12个小时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐