Pnig0s1992:因为做一个关键词情感倾向的算法需要将关键字通过搜索引擎查询并取得结果集总数,前期框架是用C++写的,没辙只能接着用C++去调用Bing API的WebService了。Google了下,发现在C/C++下调用搜索引擎API的文章几乎没有,也许是杀鸡用牛刀了吧,经过一些时间的技术调查,最终通过gSOAP解决了这个问题。
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。gSOAP还是非常强大的,下面来说下具体操作。首先需要在http://www.bing.com/developers/createapp.aspx这里申请一个APPID才能使用Bing的一系列API。申请完之后构造如下连接YOURAPPIDhttp://api.search.live.net/search.wsdl?AppID= ,接下来祭出gSOAP,我使用的是最新的2.8.8版。下载之后解压,gsoap\bin\win32目录下有两个可执行文件wsdl2h.exe和soapcpp2.exe。把gsoap\WS目录下的typemap.dat复制到gsoap\bin\win32目录下,在命令行下执行:wsdl2h.exe -o BingAPI.h 。成功后win32目录下会生成一个BingAPI.h文件。然后在命令行执行:soapcpp2.exe -C BingAPI.h 。其中-C表示只生成客户端代码,执行成功后会在win32目录下生成若干文件,包括.h,.cpp,.nsmap,.xml等。
把刚刚生成的BingAPI.h,soapH.h,soapC.cpp,soapClient.Cpp,soapStub.h,BingPortBinding.nsmap,以及gsoap目录下的stdsoap2.h,stdsoap2.cpp以及gsoap\import下的stlvector.h复制到工程目录下,并添加进工程。然后加入winsock32.lib。
这里需要注意的是,因为我是使用C&WindowsAPI开发的 所以已经包含了WIndows.h。这里引入winsock32.lib会造成重定义错误。解决办法就是在#include <windows.h>前面加入#define WIN32_LEAN_AND_MEAN如果你使用的是纯C库函数就没这个问题了。所有类的具体实现在soapStub.h里,下面直接给出调用Bing API的实例代码,头文件还需要
#include "soapH.h"
#include "BingPortBinding.nsmap"
- soap clientSOAP;
- _ns1__SearchRequest BingRequest;
- _ns1__SearchResponse BingResponse;
- ns1__SearchRequest BingSearchRequest;
- ns1__SearchResponse BingSearchResponse;
- soap_init(&clientSOAP);
- BingSearchRequest.AppId = "91DXXXXXXXXXXXXXB658A146E9DC007C2BA1";
- BingSearchRequest.Query = "优秀";
- BingSearchRequest.Market = new std::string("zh-cn");
- BingSearchRequest.Sources = new class ns1__ArrayOfSourceType();
- BingSearchRequest.Sources->SourceType.push_back(ns1__SourceType::ns1__SourceType__Web);
- BingRequest.parameters = &BingSearchRequest;
- BingResponse.parameters = &BingSearchResponse;
- if(soap_call___ns1__Search(&clientSOAP,NULL,NULL,&BingRequest,&BingResponse) == SOAP_OK)
- {
- cout<<BingResponse.parameters->Version<<endl;
- cout<<*BingResponse.parameters->Web->Total<<endl;
- }else
- {
- printf("\n使用Bing查询出错!");
- }
- soap_destroy(&clientSOAP);
- soap_end( &clientSOAP);
- soap_done(&clientSOAP);
- return;
Over~Thx for reading&Any comment is welcomed!