学习记录》
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;
}
运行结果展示:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)