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/
生成了Makefile文件;
执行编译
[fm@vm178 gsoap-2.8]$ make
编译报错了,没有找到openssl对应的头文件目录,安装openssl,修改Makefile,指定opensssl的头文件目录,修改方法如下:
a、进入/home/fm/gsoap-2.8/gsoap目录下,找到Makefile文件;
b、打开Makefile文件,修改
c、进入/home/fm/gsoap-2.8,再次执行make
报了zlib.h找不到,按照同样的方法,添加zlib的头文件目录,
重新编译;
plugin目录下面文件编译报错了,修改wsdl目录下的Makefile文件:
重新执行make & make install,编译安装完成;
2、按照官方说明,必须先安装bison、flex,找到操作系统对应版本的安装即可,当前系统已经安装了这两个依赖程序
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参数;
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
执行后,能获取到天气数据
4、使用gsoap对外提供webservice接口
参考:https://blog.****.net/SUKHOI27SMK/article/details/42421525
https://blog.****.net/guxch/article/details/8490763
[fm@localhost demo]$ g++ -o server server.cpp soapC.cpp soapcalcProxy.cpp soapcalcService.cpp stdsoap2.cpp