之前做项目时,需要调用webservice,于是在网上找了两篇比较重要的博文(详见文章结尾部分的参考文献),顺藤摸瓜地做成功了。后来竟又碰到需要做此
操作的项目,但依据参考文献还是折腾了我一个多小时,气急之下写成文章,以观后效。
1、下载最新版本的gsoap,我选用的是gsoap2.8.16 http://sourceforge.net/projects/gsoap2/files/gSOAP/。
2、如博文[1]中所述,建议一个空的头文件WebService.h,事实上这个文件名是自定义的,如a.h。
3、为了更好的支持中文,再建立一个文件wsmap.dat,在此文件中输入xsd__string = | std::wstring | wchar_t*,点击保存。
4、生成webservice调用类,此处以天气预报为例。
(1)cmd打开控制台程序,切换到gsoap所在磁盘的目录,比如 F:\WebService\gsoap-2.8\gsoap\bin\win32,此时目录下应该有四个文件。
(2)在控制台窗口中输入第一个编译命令wsdl2h -o WebService.h -n WS -t wsmap.dat http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL,
这一步如果成功了,控制台窗口末尾处会出现下图中的几个提示,并且目录下面的WebService.h文件大小由0KB变成76KB。
关于第一个编译命令的几点说明:
a、在编译命令中请不要加入 -s ,不然编译会不成功。
b、编译命令中-o 表示编译生成到WebService.h中;-n 表示修改webservice中默认函数的头部,在天气预报示例中,之前的函数头部是ns,被修改成了WS;
-t 表示选用后面文件中的字符转换规则(每个编译选项后面都有各自的参数)。详细命令说明请查看参考文献[1]。
(3)在控制台窗口中输入第二个编译命令soapcpp2 -C WebService.h -L -j -x -I F:\WebService\gsoap-2.8\gsoap\import,编译结果如下图所示
就像第二个图中提示的用-j来编译生成文件,而并非参考文献[1]或[2]中所选用的-i,这个要根据实际情况来,搞不好后面的版本会是选用-k,其余的命令说明详
见参考文献[1],编译之后得到的最少文件见下图。
红线划掉的部分是第一个图的四个原始文件,最后一共生成调用文件6个。
5、示例代码
// testwebservice.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "WeatherWSSoap.nsmap"
#include "soapWeatherWSSoapProxy.h"
#include <conio.h>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
WeatherWSSoapProxy weatherwebservice; // 代理类
_WS1__getWeather cityName; // 获取近5天天气情况及城市信息
_WS1__getWeatherResponse weatherResponse;
cityName.theCityCode = _T("长沙");
int result = weatherwebservice.getWeather(&cityName, &weatherResponse);
if(SOAP_OK == result)
{
vector<wstring> weatherString = weatherResponse.getWeatherResult->string;
vector<wstring>::iterator itr;
vector<wstring>::iterator itr_end;
cout<<"近5天天气情况及城市信息:"<<endl;
for(itr = weatherString.begin(),itr_end = weatherString.end(); itr!=itr_end; ++itr)
{
wcout.imbue(locale(locale(), "", LC_CTYPE));
wcout<<(*itr)<<endl;
}
cout<<endl;
}
_getch();
return 0;
}
正如我在参考文献[1]中的留言一样,vs2005以上的版本,wcout是不能直接输出中文的,需要在输出中文前加上wcout.imbue(locale(locale(), "", LC_CTYPE));
详情请查看参考文献[3]。另外,想要编译通过还需要将目录F:\WebService\gsoap-2.8\gsoap下的stdsoap2.h和stdsoap2.cpp拷贝到程序目录下。如果你生成的是
有预编译头的工程,那么每个.cpp文件前都需要添加上#include "stdafx.h"。
参考文献
[1] http://blog.youkuaiyun.com/lanshengsheng2012/article/details/9268335 2013-07-08
[2] http://blog.youkuaiyun.com/wziyx513225244/article/details/8448391#comments 2012-12-28
[3] http://blog.youkuaiyun.com/liziyun537/article/details/6024512 2010-11-21
后记
感谢所有参考文献勃主,感谢最初的抛砖者,感谢CCTV,感谢MTV,感谢KTV。。。