[gSOAP]MFC调用WEBService
2014-02-27 16:36
381 查看
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。
gSOAP官网:点击打开链接
我现在只想说:gSOAP就是个傻瓜相机——非常好用!
本文介绍如何利用gSOAP,达到在MFC下调用WEBService的API的目的。仅客户端。
1、VC6
2、gSOAP 2.8.17(官方下载地址)
3、一个目标(一个WEBService,一般以WSDL结尾,如果是asmx结尾的,在URL后面加上“?wsdl”)
(当然在bin文件夹内你还能看到macosx、linux386,为什么我要进入win32呢?因为擦屁!)
2、打开cmd.exe(什么?cmd怎么打开?乖,洗洗睡吧)。将路径设置到gsoap-2.8\gsoap\bin\win32。
3、
(1)输入命令:wsdl2h -s -o MLGB.h XXXXXXXXXXXXXXXXXXXXXX。说明,wsdl2h就是那个exe之一,-s、-o都是参数。-s代表不使用STL,取而代之需要在工程中包含stdsoap2.h和stdsoap2.cpp。-o file代表指定输出文件名称。-t 文件名,指定type map文件,默认为typemap.dat。还有很多参数,自己输入“?”问号查看。XXXXXXXXXXX就是你的URL。成功后在win32文件夹里多了个MLGB.h文件。
(2)输入命令:soapcpp2 -i -C MLGB.h。说明,soapcpp2就是另外那个exe,-i代表使用Proxy ,-C代表生成客户端代码。注意大小写。有的童鞋可能遇到了问题,提示找不到文件?在gsoap文件夹里找import文件夹(我的是C:\gsoap-2.8\gsoap\import),在刚才的命令后面加上“-I XXXX”,XXXX是你的import文件夹路径,绝对路径。成功后在win32文件夹里多了一大波文件。好吧,很头疼,其实不需要这么多,再输入“del *.xml”,回车~~~~世界都清静了。
(3)介个时候,回到win32文件夹,比起第一步时,应该又多了soapStub.h、soapH.h、soapC.cpp、soapXXXXSoapProxy.h、soapXXXXSoapProxy.cpp、XXXXSoap.nsmap、soapClient.cpp。XXXX是啥,这不是你决定的,由那个URL指向的服务器名决定(我的叫ADReportWebService1)。刚说的这个几个文件,除了soapClient.cpp全部拷贝出来,放到你的工程目录下。
(4)用VC6新建一个MFC的EXE工程,不要包含SOCKET因为gSOAP已经包含了。这里就是工程目录。文件管理中加入拷过来的所有H、CPP文件。就像这样
修改所有的、你加进来的4个CPP文件,在开头增加,
在stdsoap2.cpp里还要加
将整个工程里以下代码删除
(5)在你要用的头文件H里加入
在CPP文件里这样使用
如果你还遇到了soap_send的错误,把类似
的地方改为
一个汉字用UTF8表示通常占用3个BYTE, 如:
你 --〉0xe4, 0xbd, 0xa0
好 --> 0xe5, 0xbd, 0x21
gSoap在封装XML包时,在进行utf8字符转换时:
1)如果入口参数为 char* / std::string (即用多字节表示汉字)时,汉字因为已经用2个字节(窄字符)表示,此时的UTF8编码已近不是对该汉字的码值编码,而是对组成该汉字的两个字符进行utf8编码,结果自然不对了。因此乱码。
UTF8(0xAABB) != UTF8(0XAA + 0XBB)
2)如果入口参数为 wchar_t* / std:wstring(即一个汉字用一个字符表示)时,汉字因为用1个宽字符表示(两个字节),因此UTF8转换没有问题。
gSoap在解包时,因为来源字符串已经用UTF8表示,因此在gsoap的response中,用std::string/char*,道理上,在转换到当前字符集,应该不会乱码。
由于gsoap的调用代码是自动生成的,如何办?我们需要在生成gSoap调用代码时,强制使用wchar_t*/std::wstring. 我们可以修改default类型转换文件或者强制使用某个类型转换文件。在mytypema.dat(拷贝自typemap.dat)里写
xsd__string = | std::wstring | wchar_t* # 注释符号为#
那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地支持中文。
然后将步骤3(1)的
wsdl2h -s -o MLGB.h XXXXXXXXXXXXXXXXXXXXXX
改为
wsdl2h -s -o MLGB.h -t mytypemap.dat XXXXXXXXXXXXXXXXXXXXXX
gSOAP官网:点击打开链接
我现在只想说:gSOAP就是个傻瓜相机——非常好用!
本文介绍如何利用gSOAP,达到在MFC下调用WEBService的API的目的。仅客户端。
工具&环境:
0、WIN XP1、VC6
2、gSOAP 2.8.17(官方下载地址)
3、一个目标(一个WEBService,一般以WSDL结尾,如果是asmx结尾的,在URL后面加上“?wsdl”)
步骤:
1、下载好gSOAP后,解压。在解压后的文件夹里打开gsoap-2.8\gsoap\bin\win32,可以看见2个exe文件。(当然在bin文件夹内你还能看到macosx、linux386,为什么我要进入win32呢?因为擦屁!)
2、打开cmd.exe(什么?cmd怎么打开?乖,洗洗睡吧)。将路径设置到gsoap-2.8\gsoap\bin\win32。
3、
(1)输入命令:wsdl2h -s -o MLGB.h XXXXXXXXXXXXXXXXXXXXXX。说明,wsdl2h就是那个exe之一,-s、-o都是参数。-s代表不使用STL,取而代之需要在工程中包含stdsoap2.h和stdsoap2.cpp。-o file代表指定输出文件名称。-t 文件名,指定type map文件,默认为typemap.dat。还有很多参数,自己输入“?”问号查看。XXXXXXXXXXX就是你的URL。成功后在win32文件夹里多了个MLGB.h文件。
(2)输入命令:soapcpp2 -i -C MLGB.h。说明,soapcpp2就是另外那个exe,-i代表使用Proxy ,-C代表生成客户端代码。注意大小写。有的童鞋可能遇到了问题,提示找不到文件?在gsoap文件夹里找import文件夹(我的是C:\gsoap-2.8\gsoap\import),在刚才的命令后面加上“-I XXXX”,XXXX是你的import文件夹路径,绝对路径。成功后在win32文件夹里多了一大波文件。好吧,很头疼,其实不需要这么多,再输入“del *.xml”,回车~~~~世界都清静了。
(3)介个时候,回到win32文件夹,比起第一步时,应该又多了soapStub.h、soapH.h、soapC.cpp、soapXXXXSoapProxy.h、soapXXXXSoapProxy.cpp、XXXXSoap.nsmap、soapClient.cpp。XXXX是啥,这不是你决定的,由那个URL指向的服务器名决定(我的叫ADReportWebService1)。刚说的这个几个文件,除了soapClient.cpp全部拷贝出来,放到你的工程目录下。
(4)用VC6新建一个MFC的EXE工程,不要包含SOCKET因为gSOAP已经包含了。这里就是工程目录。文件管理中加入拷过来的所有H、CPP文件。就像这样
修改所有的、你加进来的4个CPP文件,在开头增加,
#include "stdafx.h"
在stdsoap2.cpp里还要加
#include "XXXXSoap.nsmap"
将整个工程里以下代码删除
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
(5)在你要用的头文件H里加入
#include "soapXXXXSoapProxy.h"
在CPP文件里这样使用
//此处我的API函数原型:string UserCheck(string logid, string password) //gSOAP生成了XXXXSoapProxy::UserCheck(),参数略去未写。一般的使用是2个参数,第一个是原函数的输入值,第二个是原函数的返回值,此处都为引用传参。 //gSOAP根据该函数生成2个类, //_ns1__UserCheck,该函数的参数 //_ns1__UserCheckResponse,该函数的返回值 //UserCheck函数使用如下: XXXXSoapProxy ClientSoap; //XXXXSoapProxy 就是你的类名 _ns1__UserCheck userCheckReq; _ns1__UserCheckResponse userCheckRer; userCheckReq.logid = "QN"; //给传入参数赋值 userCheckReq.password = "MLGB"; //赋值 if (SOAP_OK == ClientSoap.UserCheck(&userCheckReq, &userCheckRer)) { CString strResult = userCheckRer.UserCheckResult; //NB你成功了!userCheckRer.UserCheckResult里保存的就是返回值 }
如果你还遇到了soap_send的错误,把类似
soap_send(soap_encode_url_string(soap, strLogid)
的地方改为
soap_send(soap, soap_encode_url_string(soap, strLogid)
解决中文乱码
参考资料:gsoap中文乱码及内存清理等问题的解决方案一、问题和分析
gsoap在调用Webservice过程中,如果字符串中有汉字,很容易出现乱码。 由于网络间一般用UTF8表示字串(ANSI字串- (char < 128)本身已经符合UTF8编码规则),所以ANSI字符不会乱码,而一个汉字的传统表示需要两个字符,而在wchar_t宽字符串中只需一个字符表示。一个汉字用UTF8表示通常占用3个BYTE, 如:
你 --〉0xe4, 0xbd, 0xa0
好 --> 0xe5, 0xbd, 0x21
gSoap在封装XML包时,在进行utf8字符转换时:
1)如果入口参数为 char* / std::string (即用多字节表示汉字)时,汉字因为已经用2个字节(窄字符)表示,此时的UTF8编码已近不是对该汉字的码值编码,而是对组成该汉字的两个字符进行utf8编码,结果自然不对了。因此乱码。
UTF8(0xAABB) != UTF8(0XAA + 0XBB)
2)如果入口参数为 wchar_t* / std:wstring(即一个汉字用一个字符表示)时,汉字因为用1个宽字符表示(两个字节),因此UTF8转换没有问题。
gSoap在解包时,因为来源字符串已经用UTF8表示,因此在gsoap的response中,用std::string/char*,道理上,在转换到当前字符集,应该不会乱码。
二、解决方案
很简单,在gsoap的数据类型中,用wchar_t* 或std::wstring代替std:string/char*.由于gsoap的调用代码是自动生成的,如何办?我们需要在生成gSoap调用代码时,强制使用wchar_t*/std::wstring. 我们可以修改default类型转换文件或者强制使用某个类型转换文件。在mytypema.dat(拷贝自typemap.dat)里写
xsd__string = | std::wstring | wchar_t* # 注释符号为#
那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地支持中文。
然后将步骤3(1)的
wsdl2h -s -o MLGB.h XXXXXXXXXXXXXXXXXXXXXX
改为
wsdl2h -s -o MLGB.h -t mytypemap.dat XXXXXXXXXXXXXXXXXXXXXX
相关文章推荐
- VS 2008 mfc 智能应用程序 调用 C# webservice.(二)(gsoap+wince)
- [gSOAP]MFC调用WEBService 中文乱码
- MFC 调用 WebService
- Qt+gsoap调用WebService
- MFC客户端WebService(gSOAP)天气预报
- Qt使用gSOAP调用WebService
- gsoap客户端调用几个webservice服务
- Qt+gsoap调用WebService
- C++使用gSoap调用C#写的webservice中文乱码问题
- C++利用gSoap调用WebService服务
- GSoap的使用(调用webservice接口)
- 使用C/C++程序通过gSOAP调用WebService
- GSoap 调用webservice的一些注意事项
- gsoap生成webservice调用客户端接口
- gsoap生成webservice调用客户端接口
- 利用C++调用天气webservice-gSOAP方法
- 标准C/C++程序通过gSOAP调用WebService
- WTL 学习六 gsoap 调用webservice的过程
- Qt+gsoap调用WebService
- c++ .net winform 应用程序调用dll(gSOAP调用WebService)获取天气