gSoap访问Web Service
这里调用的是查询QQ状态的Service。http://www.webxml.com.cn/zh_cn/web_services.aspx?offset=2这里有很多免费的Service。
首先需要到下载gSoap开发包:我是从这下的http://www.cs.fsu.edu/~engelen/soapdownload.html
解压(我这里是直接放在C盘),C:\gsoap_2.8.17\gsoap-2.8\gsoap\bin\win32目录有两个很重要的工具
接下来开始创建客户端程序:
第一个:从命令行进入C:\gsoap_2.8.17\gsoap-2.8\gsoap\bin\win32目录
获取Web Service C++ 定义的头文件
第二步:生成客户端代理
发现有错而且没有生成任何文件:错误提示没有stlvector.h文件。需要到C:\gsoap_2.8.17\gsoap-2.8\gsoap\VisualStudio2005\wsdl2h\wsdl2h目录下把这个文件拷过来,跟QQWebService.h放在一起,然后再执行一遍刚刚的命令:
还是有错,还是少了soap12.h文件,该文件在C:\gsoap_2.8.17\gsoap-2.8\gsoap\import目录下。其实这种问题,我们可以打开QQWebService.h看看需要哪些文件。该头文件有两个语句#import "soap12.h"和#import "stlvector.h"。
这次成功生成代理文件。
第三步:使用生成的文件访问服务:
新建工程,把生成的文件拷过来,另外还需要C:\gsoap_2.8.17\gsoap-2.8\gsoap目录下的两个文件也拷过来。
这里我简单的封装一个类CCheckQQState;
头文件:
#include <string>
#include "soapH.h"
#include "soapqqOnlineWebServiceSoapProxy.h"
//#include "qqOnlineWebServiceSoap.nsmap"
using namespace std;
class CCheckQQState
{
public:
CCheckQQState();
~CCheckQQState();
string CheckState(std::string qqNumber);
protected:
private:
soap m_Soap;
_ns1__qqCheckOnline *m_pRequest;
_ns1__qqCheckOnlineResponse *m_pResponse;
qqOnlineWebServiceSoapProxy *m_pProxy;
};
Cpp文件:
#include "CheckQQState.h"
#include "qqOnlineWebServiceSoap.nsmap"
#include "soapH.h"
stringCCheckQQState::CheckState( std::string qqNumber )
{
string message ;
if(qqNumber.length() <= 0)
{
message = "无效QQ号";
returnmessage;
}
m_pRequest->qqCode = &qqNumber;
if(m_pProxy->qqCheckOnline(m_pRequest,m_pResponse) == SOAP_OK)
{
std::cout<<"调用成功"<<std::endl;
string result =*(m_pResponse->qqCheckOnlineResult);
if(strcmp(result.c_str(),string("Y").c_str())== 0)
{
message = "在线";
}
elseif (strcmp(result.c_str(),string("N").c_str()) == 0)
{
message = "离线";
}
elseif (strcmp(result.c_str(),string("E").c_str()) == 0)
{
message = "QQ号码错误";
}
elseif (strcmp(result.c_str(),string("A").c_str()) == 0)
{
message = " 商业用户验证失败";
}
elseif (strcmp(result.c_str(),string("V").c_str()) == 0)
{
message = "免费用户超过数量";
}
}
else
{
m_pProxy->soap_stream_fault(std::cerr);
}
returnmessage;
}
CCheckQQState::CCheckQQState()
{
m_pRequest = new_ns1__qqCheckOnline;
m_pResponse = new_ns1__qqCheckOnlineResponse;
m_pProxy = newqqOnlineWebServiceSoapProxy(SOAP_XML_INDENT);
}
CCheckQQState::~CCheckQQState()
{
deletem_pProxy;
deletem_pRequest;
deletem_pResponse;
}
#include <iostream>
#include "CheckQQState.h"
using namespace std;
int main()
{
CCheckQQState state;
cout<<state.CheckState("492406070")<<endl; // QQ号随便写的;
system("pause");
return 0;
}
这里需要注意的是:头文件不用包含//#include "qqOnlineWebServiceSoap.nsmap",否则编译出错