zoukankan      html  css  js  c++  java
  • CPP调用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,找到操作系统对应版本的安装即可,当前系统已经安装了这两个依赖程序

     

    3、编写客户端程序获取天气信息

    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.csdn.net/SUKHOI27SMK/article/details/42421525

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

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

     

     

  • 相关阅读:
    A. Vasya and Book
    B. Curiosity Has No Limits
    A. Link/Cut Tree
    C. Yuhao and a Parenthesis
    D2. Magic Powder
    B. Approximating a Constant Range
    51nod1185 威佐夫游戏 V2 (模拟乘法)
    博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)
    sg函数模板
    D.Starry的神奇魔法(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/skiing886/p/9561168.html
Copyright © 2011-2022 走看看