CPP调用webservice 3、编写客户端程序获取天气信息 4、使用gsoap对外提供webservice接口

                        CPP调用webservice解决方案

一、CURL调用webservice

使用curl命令调用接口,该方法目前不可行;

二、gsoap调用webservice

    该方法是目前推荐使用的方法,使用步骤为

操作系统

   

LINUX RHCL 7.2

   

 

1、下载gsoap源码包:gsoap_2.8.70.zip,是目前能下载的最新版本;

解压

[fm@vm178 ~]$ unzip gsoap_2.8.70.zip

配置安装目录

[fm@vm178 gsoap-2.8]$ ./configure --prefix=/home/fm/server/lib/gsoap/

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

生成了Makefile文件;

执行编译

[fm@vm178 gsoap-2.8]$ make

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

编译报错了,没有找到openssl对应的头文件目录,安装openssl,修改Makefile,指定opensssl的头文件目录,修改方法如下:

a、进入/home/fm/gsoap-2.8/gsoap目录下,找到Makefile文件;

b、打开Makefile文件,修改

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

c、进入/home/fm/gsoap-2.8,再次执行make

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

报了zlib.h找不到,按照同样的方法,添加zlib的头文件目录,

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

重新编译;

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

plugin目录下面文件编译报错了,修改wsdl目录下的Makefile文件:

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

重新执行make & make install,编译安装完成;

 

2、按照官方说明,必须先安装bison、flex,找到操作系统对应版本的安装即可,当前系统已经安装了这两个依赖程序

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

 

a、在demo目录创建一个wsmap.dat文件,写入如下内容:

xsd__string = | std::wstring | wchar_t*

此文件用来将SOAP/XML中的string转换成std::wstrin或wchar_t*,这样能更好地支持中文

b、调用wsdl2h生成头文件接口定义,命令如下:

[fm@vm178 demo]$ wsdl2h -o WebService.h -n WS -t wsmap.dat http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL

参数-s表示生成不带STL的C/C++语法结构的头文件WebService.h。如果不用-s就会生成带STL的头文件,这样,在后边的编译中需要加入STL的头,本次预研不加-s,使用带STL的头;

c、因为上一步b中没有指定-s参数,这一步必须指定-I参数

[fm@vm178 demo]$ soapcpp2 -C WebService.h -i -L -I ../gsoap-2.8/gsoap/import/

这一步会得到如下6个文件,另外还有不少.xml文件,暂时不用理会,如果不希望生成这些没用的xml文件,可以加上-x参数;

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

d、将上面生成的*.h *.cpp *.nsmap拷贝到项目目录下面,同时还要将stdsoap2.h、stdsoap2.cpp从gsoap中拷贝到项目目录中,开始编写test.cpp,代码如下:

#include <iostream>

#include <vector>

#include <string>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <wchar.h>

#include <locale.h>

 

 

//载入webservice的头文件和命名空间

#include "soapWeatherWebServiceSoapProxy.h"

#include "WeatherWebServiceSoap.nsmap"

 

using namespace std;

 

int ToWchar(char* &src, wchar_t* &dest, const char *locale = "zh_CN.utf8")

{

if (src == NULL) {

dest = NULL;

return 0;

}

 

// 根据环境变量设置locale

setlocale(LC_CTYPE, locale);

 

// 得到转化为需要的宽字符大小

int w_size = mbstowcs(NULL, src, 0) + 1;

 

// w_size = 0 说明mbstowcs返回值为-1。即在运行过程中遇到了非法字符(很有可能使locale

// 没有设置正确)

if (w_size == 0) {

dest = NULL;

return -1;

}

 

wcout << "w_size" << w_size << endl;

dest = new wchar_t[w_size];

if (!dest) {

return -1;

}

 

int ret = mbstowcs(dest, src, strlen(src)+1);

if (ret <= 0) {

return -1;

}

return 0;

}

 

 

int main()

{

     //初始化webservice对象

    WeatherWebServiceSoapProxy proxy("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");

 

    char* str = "";

    wchar_t *w_str;

    ToWchar(str,w_str);

    //初始化getSupportCity对象

    _WS1__getSupportCity weatherCity;

    weatherCity.soap = &proxy;

    weatherCity.byProvinceName = w_str;

    

    _WS1__getSupportCityResponse response;

    proxy.getSupportCity(&weatherCity, response);

    //wcout.imbue(locale("chs"));

    for (int i = 0; i < response.getSupportCityResult->string.size(); i++)

        wcout << response.getSupportCityResult->string[i] << endl;

    

    //默认将获取上海的天气信息

    _WS1__getWeatherbyCityName weatherName;

    weatherName.soap = &proxy;

    weatherName.theCityName = w_str;

    

    _WS1__getWeatherbyCityNameResponse weatherResponse;

    proxy.getWeatherbyCityName(&weatherName, weatherResponse);

    

    for (int i = 0; i < weatherResponse.getWeatherbyCityNameResult->string.size(); i++)

        wcout << weatherResponse.getWeatherbyCityNameResult->string[i] << endl;

    return 0;

}

编译、链接

g++ -o client -g test.cpp soapC.cpp soapWeatherWebServiceSoapProxy.cpp stdsoap2.cpp

执行后,能获取到天气数据

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

4、使用gsoap对外提供webservice接口

参考:https://blog.csdn.net/SUKHOI27SMK/article/details/42421525

https://blog.csdn.net/guxch/article/details/8490763

CPP调用webservice
3、编写客户端程序获取天气信息

4、使用gsoap对外提供webservice接口

[fm@localhost demo]$ g++ -o server server.cpp soapC.cpp soapcalcProxy.cpp soapcalcService.cpp stdsoap2.cpp