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:gSOAPgsoap-2.8gsoapimport -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); //分配空间要给' '留个空间,MultiByteToWideChar不会给' '空间 wchar_t* result = new wchar_t[wcsLen + 1]; //转换 ::MultiByteToWideChar(CP_UTF8,result,wcsLen); //最后加上' ' result[wcsLen] = ' '; 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个小时。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |