c++用gsoap生成webservice调用类

    之前做项目时,需要调用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.csdn.net/lanshengsheng2012/article/details/9268335 2013-07-08

    [2] http://blog.csdn.net/wziyx513225244/article/details/8448391#comments 2012-12-28

    [3] http://blog.csdn.net/liziyun537/article/details/6024512 2010-11-21

 

    后记

    感谢所有参考文献勃主,感谢最初的抛砖者,感谢CCTV,感谢MTV,感谢KTV。。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值