【工作笔记】c++使用gsoap调用webservice

工作中需要用c++来调用第三方的webservice接口,于是使用了gsoap工具。为了初步掌握gsoap的使用方法,这里写了一个demo程序来完成对于天气预报查询接口的调用。

安装好gsoap工具,然后使用make gsoap命令编译。

/*makefile文件如下*/

#make file for testing gsoap

all:test

GSOAP_ROOT = /usr/share/gsoap/import
WSDL_FILES = $(wildcard *.wsdl)

OBJS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))

CXX = /usr/bin/g++
CXXFLAGS = -g # -fno-use-linker-plugin
LIBS = -lgsoap++

ifeq ( ,$(WSDL_FILES))
	WSDL_FILES = http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
endif

wsdl:
	wsdl2h $(WSDL_FILES) -t /usr/share/gsoap/WS/typemap.dat -o weather.h

# -C only client,-I import path,-L no soap*Lib.c file,-x no xml file
gsoap:wsdl
	soapcpp2 -iCLx -I $(GSOAP_ROOT) weather.h

test:$(OBJS)
	$(CXX) $(CXXFLAGS) $(LIBS) $^ -o $@

clean:
	@rm -rf $(OBJS) test

编译完成后会生成 WeatherWebServiceSoap.nsmap、soapWeatherWebServiceSoapProxy等之类的文件。

将这些文件放到你的项目中,然后创建一个调用天气查询的demo程序:test.cpp。

#include "WeatherWebServiceSoap.nsmap"
#include "soapWeatherWebServiceSoapProxy.h"
#include <string>
#include <iostream>
using namespace std;

void showResult(ns1__ArrayOfString* aos){
	for (vector<string>::iterator
		itr = aos->string.begin(), itr_end = aos->string.end();
		itr != itr_end; ++itr)
	{
		string str = *itr;
		const char* str2 = str.c_str();
		std::cout << str2 << std::endl;
	}
}

int main(int argc, char** argv)
{
	struct soap soap;
	soap_init(&soap);
	//soap_set_imode(&soap, SOAP_C_UTFSTRING);
	
	_ns1__getSupportCity request; 
	std::string provinceName = "四川";
	request.byProvinceName = &provinceName;

	_ns1__getSupportCityResponse response;

	WeatherWebServiceSoapProxy* serviceProxy = new WeatherWebServiceSoapProxy(SOAP_C_UTFSTRING, SOAP_C_UTFSTRING);

	/*获取支持的城市名*/
	int result=serviceProxy->getSupportCity(&request,&response);
	if (SOAP_OK==result)
	{
		showResult(response.getSupportCityResult);
	} 
	else
	{
		std::cout << "error:" << serviceProxy->soap_fault_string() << std::endl << std::endl;
	}


	/*查询城市的天气*/
	std::string cityName = "攀枝花";
	_ns1__getWeatherbyCityName weatherRequest;
	weatherRequest.theCityName = &cityName;
	_ns1__getWeatherbyCityNameResponse weatherResponse;

	int ret=serviceProxy->getWeatherbyCityName(&weatherRequest, &weatherResponse);
	if (SOAP_OK==ret){
		showResult(weatherResponse.getWeatherbyCityNameResult);
	}
	else
	{
		std::cout << "error:" << serviceProxy->soap_fault_string() << std::endl;
	}

	delete serviceProxy;

	return 0;
}

使用make 命令编译程序。执行可执行程序,结果如下:

【工作笔记】c++使用gsoap调用webservice_第1张图片

你可能感兴趣的:(C++,gsoap,天气查询)