第一步、使用gsoap工具打包C++接口,测试webserver(天气预报):http://ws.webxml.com.cn/WebServices/WeatherWS.asmx。
1.1、首先下载gsoap打包工具,下载地址:https://download.youkuaiyun.com/download/cwj066/11484761
1.2、把下载的gsoap-2.8.87.rar 解压到任意目录,解压出来的目录为gsoap-2.8。
1.3、打开windows下载的命令终端,进到目录xx:\gsoap-2.8\gsoap\bin\win32。如下所示:
1.4、在win32目录下新建wsmap.bat文件,里面写入xsd__string = | std::wstring | wchar_t*。
1.5、在终端输入命令:.\wsdl2h.exe -o .\Webservice.h http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl,(接口地址后面一定要加?wsdl)。然后回车。就会在win32目录下生成Webservice.h文件
1.6、接着输入命令:.\wsdl2h.exe -o .\WeatherWS.h http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl -t wsmap.bat,把WeatherWS.h文件中的 char* 替换成 wchar_t* ,解决传输数据是中文乱码。
1.7、接着输入命令:.\soapcpp2.exe -C .\WeatherWS.h -I .\..\..\import –x,生成完整的C++接口。此时在win32目录下会自动生成soapC.cpp、soapClient.cpp、soapClientLib.cpp、soapH.h、soapStub.h、WeatherWS.h、WeatherWSSoap.nsmap。
当看到Compilation successful时,表明生成C++接口成功。
1.8、在浏览输入http://ws.webxml.com.cn/WebServices/WeatherWS.asmx 可以看到此webserver的所有接口函数。
在上图中可以看到,此webserver总共有6个接口函数,每个函数的功能、函数输入参数、输出参数写的非常详细。最后在我们的win32目录下找到soapClient.cpp 并打开,此时我们也可以看到6个接口函数,分别对应webserver的6个接口函数。soapClient.cpp 中的6个函数名分别为soap_call___ns1__getRegionDataset、soap_call___ns1__getRegionProvince、soap_call___ns1__getSupportCityDataset、soap_call___ns1__getWeather、soap_call___ns1__getRegionCountry、soap_call___ns1__getSupportCityString在我们的工程中分别调用这6个接口函数就可以获取webserver的数据。下面在vs2010测试这6个接口函数。
第二步、使用vs2010新建一个测试工程,测试生成的C++接口文件。
2.1、使用vs2010新建win32控制台程序,名字为test6。
2.2、把刚刚在win32目录下生成的文件导入到工程,导入的文件分别为soapH.h、soapStub.h、WeatherWSSoap.nsmap、soapC.cpp、soapClient.cpp,最后把gsoap-2.8\gsoap目录下的stdsoap2.h、stdsoap2.cpp也导入到工程,结果如下图所示。
2.3、在test6.cpp引入soapH.h、WeatherWSSoap.nsmap文件
2.4、测试6个接口函数,在mina函数调用接口。
2.4.1、调用soap_call___ns1__getRegionProvince接口获取中国的所有省份。代码如下
//1.SOAP的客户端
soap m_oSoap;
//2.WebService调用对象
_ns1__getRegionProvince getMobileCodeObject;
//3.WebService返回对象
_ns1__getRegionProvinceResponse getMobileCodeResponseObject;
//4.SOAP初始化
soap_init(&m_oSoap);
//5.发送WebService请求,获取中国的所有省份
int nResult = soap_call___ns1__getRegionProvince(&m_oSoap, NULL, NULL, &getMobileCodeObject, getMobileCodeResponseObject);
//6.操作成功
if(SOAP_OK == nResult)
{
// 输出返回结果
std::vector<std::wstring> vResult = getMobileCodeResponseObject.getRegionProvinceResult->string;
int iSize = vResult.size();
for (int i = 0; i < iSize; i++)
{
string sProvince = ws2s(vResult[i]); //输出省份
cout << sProvince << endl;
}
}
测试结果如下:
2.4.2、调用soap_call___ns1__getRegionCountry接口获取国家。代码如下
//1.SOAP的客户端
soap m_oSoap;
//2.WebService调用对象
_ns1__getRegionCountry country;
//3.WebService返回对象
_ns1__getRegionCountryResponse result;
//4.SOAP初始化
soap_init(&m_oSoap);
//5.发送WebService请求,获取中国的所有省份
int nResult = soap_call___ns1__getRegionCountry(&m_oSoap, NULL, NULL, &country, result);
//6.操作成功
if(SOAP_OK == nResult)
{
// 输出返回结果
std::vector<std::wstring> vResult = result.getRegionCountryResult->string;
int iSize = vResult.size();
for (int i = 0; i < iSize; i++)
{
string sCountry = ws2s(vResult[i]); //输出国家
cout << sCountry << endl;
}
}
测试结果如下:
2.4.3、调用soap_call___ns1__getWeather接口获取某个城市的天气情况。代码如下
//1.SOAP的客户端
soap m_oSoap;
//2.WebService调用对象
_ns1__getWeather weather; //theRegionCode
weather.theCityCode = L"755";
//3.WebService返回对象
_ns1__getWeatherResponse rs;
//4.SOAP初始化
soap_init(&m_oSoap);
//5.发送WebService请求,获取中国的所有省份
int nResult = nResult = soap_call___ns1__getWeather(&m_oSoap, NULL, NULL, &weather, rs);
//6.操作成功
if(SOAP_OK == nResult)
{
// 输出返回结果
std::vector<std::wstring> vResult = rs.getWeatherResult->string;
int iSize = vResult.size();
for (int i = 0; i < iSize; i++)
{
string sWeather = ws2s(vResult[i]);
cout << sWeather << endl;
}
}
//7.关闭SOAP
soap_destroy(&m_oSoap);
soap_end(&m_oSoap);
soap_done(&m_oSoap);
测试结果如下:
剩下的3个接口函数,感兴趣的可以自己动手测试。
工程源码下载:https://download.youkuaiyun.com/download/cwj066/11485080