C++ Linux使用gSoap进行WebService通信(客户端)

C++ Linux使用gSoap进行WebService通信(客户端),第1张

学习记录》

1. gsoap地址:gSoap官方网站http://gsoap2.sourceforge.net 下载gSoap工具包。

下载页面:Genivia - gSOAP C and C++ SOAP/XML Web Services Tools

网站上也有使用说明 Genivia - gSOAP user guide。可以观看官网的使用入门来学习。

2.编写用于WebService交互的客户端。

获取到对应的wsdl文件,可以用天气预报wsdl进行测试

http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

①使用wsdl2h 工具使用 WSDL 来生成 C 或 C++ 接口头文件

wsdl2h 工具生成一个 XML 数据绑定接口头文件,该文件包含从 WSDL 和 XSD 收集到的所有信息,这些信息作为命令行参数输入 wsdl 工具。wsdl2h 的默认输出文件名是第一个 WSDL/模式输入文件名,但带有.h替换的扩展名.wsdl(或.xsd在指定 XSD 文件的情况下替换)。当输入文件不存在或从 Web URL 加载 WSDL 文件时,将在标准输出上生成标头输出,除非使用wsdl2h -o file.h选项-o file.h将输出保存到file.h(或指定的任何其他文件名)。

 wsdl2h参数说明如下:
-o 文件名,指定输出头文件
-n 命名空间前缀 代替默认的ns
-c 产生纯C代码,否则是C++代码
-s 不要使用STL代码
-t 文件名,指定type map文件,默认为typemap.dat
-e 禁止为enum成员加上命名空间前缀 

wsdl2h -o weather.h WeatherWebService.wsdl

wsdl2h -h           //可以获取wsdl2h工具的使用方法
②使用soap2cpp工具为接口文件中声明的每种可序列化C / C ++类型生成一组函数
soapcpp2 -i weather.h

soapC.cpp     指定数据结构的序列化器和反序列化器
soapH.h         主 Header 文件,所有客户机和服务源代码都要将其包括在内
soapStub.h    从输入 Header 文件生成的经过修改且带标注的 Header 文件
soapWeatherWebServiceSoapProxy.cpp
soapWeatherWebServiceSoapProxy.h
这两个文件是客户端代码的一个简单封装,它封装了底层通信。客户端通过实例化该类进行调用。
stdsoap2.cpp        运行时 C++ 库,带 XML 解析器和运行时支持例程
stdsoap2.h            为stdsoap2.cpp 运行时库的 Header 文件
WeatherWebServiceSoap.nsmap        命名空间定义,客户端需要包含它

说明来源:https://blog.csdn.net/forever11282002/article/details/122147282 

 ③将以下文件添加到程序中,编译即可正常调用天气预报的接口。那些xml不参与编译。

#include "soapweather/soapWeatherWebServiceSoapProxy.h"
#include "soapweather/WeatherWebServiceSoap.nsmap"

#include 
int main()
{
    printf("%s 向你问好!\n", "gsoapApp");
    WeatherWebServiceSoapProxy proxy("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl", SOAP_C_UTFSTRING);
    soap_init(&proxy);
    //必须要加上这个,不然中文全部乱码
    soap_set_mode(&proxy, SOAP_C_UTFSTRING);
    _ns1__getSupportCity ns1__getSupportCity;
    std::string provinceName("江苏");
    ns1__getSupportCity.soap = &proxy;
    ns1__getSupportCity.byProvinceName = &provinceName;
    _ns1__getSupportCityResponse ns1__getSupportCityResponse;

    int nResult = proxy.getSupportCity(&ns1__getSupportCity, ns1__getSupportCityResponse);

    if (SOAP_OK == nResult)
    {
        std::vector vectorTemp = ns1__getSupportCityResponse.getSupportCityResult->string;
        
        printf("调用getSupportCity接口!\n");
        for (int i = 0; i < vectorTemp.size(); i++)
        {
            printf("[%d]->%s !\n", i + 1, vectorTemp[i].c_str());
        }
    }

    _ns1__getWeatherbyCityName ns1__getWeatherbyCityName;
    std::string cityName("北京");
    ns1__getWeatherbyCityName.soap = &proxy;
    ns1__getWeatherbyCityName.theCityName = &cityName;
    _ns1__getWeatherbyCityNameResponse	response;
    nResult = proxy.getWeatherbyCityName(&ns1__getWeatherbyCityName, response);
    if (SOAP_OK == nResult)
    {
        std::vector vectorTemp = response.getWeatherbyCityNameResult->string;
        printf("调用getWeatherbyCityName接口!\n");
        for (int i = 0; i < vectorTemp.size(); i++)
        {
            printf("[%d]->%s !\n",i+1, vectorTemp[i].c_str());
        }
    }
    while (1)
    {
        sleep(100);
    }
    return 0;
}

运行结果展示:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/676180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存