月光博客

青青子衿, 悠悠我心, 但为君故, 沉吟至今

« Google Blogger Beta中文界面启用申请Google AdSense for Feeds »

通过Web Service调用Google SOAP Search API

  我曾经介绍过“使用Axis开发Web Service程序”的一些步骤,做为一个更有特色的应用范例,本次我将介绍使用Axis通过Web Service调用Google SOAP Search API,实现Google搜索、Google快照、Google拼写这三项功能,包括示例源代码。

  一、环境配置

  首先,没有Java开发环境的,需要安装一下环境,点这里查看《Java开发环境的详细配置方法》,其实,本示例安装JDK 1.42以及Eclipse 3.2就可以了。

  二、将Apache Axis相关包文件放在WEB-INF\lib目录下

  从Apache的主页上下载Axis包文件,复制到lib目录下。

  三、申请Google SOAP Search API license key

  要使用Google的服务,必须要有“license key”,如果你有Gmail帐号,点这里就可以申请license key,这个license key是一段很长的字符串,每个key可以支持每天1000次的Google搜索。

  四、下载WSDL文件,生成客户端Java代码

  WSDL文件的下载地址参见:http://api.google.com/GoogleSearch.wsdl

  生成客户端代码的批处理文件如下:

set Axis_Lib=D:\workspace\test\WEB-INF\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:\workspace\test\src
set Package=com.google.api
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% GoogleSearch.wsdl

  最后会生成下列代码文件:

DirectoryCategory.java
GoogleSearchBindingStub.java
GoogleSearchPort_PortType.java
GoogleSearchResult.java
GoogleSearchService.java
GoogleSearchServiceLocator.java
ResultElement.java

  五、编写程序,调用Google SOAP Search API

  在上面那个包下,编写你自己的Java程序,就可以调用Google SOAP Search API.目前可以使用的Google服务有:网页搜索,网页快照,拼写检查这三个。

  Java示例代码如下,请使用前将clientKey替换为你自己的。替换后直接运行即可得出结果。

package com.google.api;

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;

public class ClientGoogle {

  public static void main(String[] args) throws ServiceException,
    RemoteException {
    String clientKey = "kkkkkkkkkkkkkkkkkkkkkkkkkkey";
    GoogleSearchServiceLocator service = new GoogleSearchServiceLocator();
    GoogleSearchPort_PortType gsp = service.getGoogleSearchPort();

    //Google Search API
    GoogleSearchResult searchResult = gsp.doGoogleSearch(clientKey,
        "www.williamlong.info", 0, 10, false, "", false, "", "latin1",
        "latin1");
    System.out.println("Google Search Results:");
    System.out.println("======================");
    ResultElement results[] = searchResult.getResultElements();
    for (int counter = 0; counter < results.length; ++counter) {
      ResultElement result = results[counter];
      String returnResult = "('" + result.getTitle() + "','"
          + result.getURL() + "','" + result.getSnippet() + "')";
      System.out.println("Return Result");
      System.out.println(returnResult);
    }

    //Google CachedPage
    byte[] cachedBytes = gsp.doGetCachedPage(clientKey,
        "http://www.williamlong.info/");
    System.out.println("Cached page:");
    System.out.println("============");
    String cachedString = new String(cachedBytes);
    System.out.println(cachedString);

    //Google SpellingSuggestion
    String suggestion = (String) gsp.doSpellingSuggestion(clientKey,
        "williamlong");
    System.out.println(suggestion);

  }

}

  当然,你也可以不使用Apache Axis,Google自己也提供了一个API包可以做为客户端调用,下载地址参见这里

  最后声明一下,Google SOAP Search API是属于实验产品,每个license每天最多只允许搜索一千次,其许可协议注明不能使用于商业模式的网站,而对于个人研究来说,每天一千次的搜索也就足够了。

  相关专业名词解释:

  Web Service:是一种革命性的分布是计算技术。它使用基于XML的消息处理作为基本的数据通讯方式,消除使用不同组件模型、操作系统和编程语言的系统之间存在的差异,使异类系统能够作为计算网络的一部分协同运行。开发人员可以使用像过去创建分布式应用程序时使用组件的方式,创建由各种来源的Web服务组合在一起的应用程序。由于Web服务是建立在一些通用协议的基础上,如HTTP(Hypertext Transfer Protocol, WWW服务程序所用的协议),SOAP(Simple Object Access Protocol,简单对象访问协议),XML,WSDL(Web Services Description Language,Web服务描述语言),UDDI(Universal Description,Discovery,and Integration,通用描述发现和集成协议)等,这些协议在涉及到操作系统、对象模型和编程语言的选择时,没有任何倾向,因此Web服务将会有很强的生命力。

  SOAP:是“Simple Object Access Protocol”的缩写,SOAP是消息传递的协议,它规定了Web Services之间是怎样传递信息的。简单的说,SOAP规定了:

  1. 传递信息的格式为XML.这就使Web Services能够在任何平台上,用任何语言进行实现。

  2. 远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等。

  3. 参数类型和XML格式之间的映射。这是因为,被调用的方法有时候需要传递一个复杂的参数,例如,一个Person对象。怎样用XML来表示一个对象参数,也是SOAP所定义的范围。

  WSDL:是“Web Services Description Language”的缩写。WSDL是Web Services的定义语言。当实现了某种服务的时候(如:股票查询服务),为了让别的程序调用,必须告诉大家服务接口。例如:服务名称,服务所在的机器名称,监听端口号,传递参数的类型,个数和顺序,返回结果的类型等等。这样别的应用程序才能调用该服务。WSDL协议就是规定了有关Web Services描述的标准。

  UDDI:是“Universal Description, Discovery,and Integration”的缩写。简单说,UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。

  XML:(eXtensible Markup Language,可扩展标记语言)是Internet上数据表示和数据交换的新标准。它是ISO(International Organization for Standardization,国际标准化组织)的SGML(Standard for General Markup Language,通用标记语言标准)的一个简化子集。XML关注信息本身,是Web上表示结构化信息的一种标准文本格式。与传统的注重页面信息显示的HTML(Hypertext Markup Language, 超文本链接标示语言)相比,关注于内容的XML具有以下诸多优点:良好的可扩展性,语言简单有效,可自行定义标记;内容与形式的分离,主要刻画数据内容,不考虑显示效果;有严格的语法要求,便于分析统一和与数据库信息转换;便于传输,为纯文本形式,可通过Http协议直接传输,可跨越防火墙;等等。XML的出现和发展对于Internet和Intranet产生了巨大的影响。



原创文章如转载,请注明:转载自月光博客 [ http://www.williamlong.info/ ]

本文链接地址:http://www.williamlong.info/archives/711.html
  • 文章排行:
  • 2.flybutterfly
  • 我在《Java Servlet & JSP Cookbook》(January 2004)第27章Using the Google and Amazon Web APIs看过类似的范例,不过我能运行google的范例程序,却不能运行Amazon的,因他给的好多链接都失效了。
  • 2006-12-3 17:47:47
  • 6.什么把torpark干掉了
  • 没地震前torpark还能用。地震后就不好使了?和地震有关系吗?好像是风马牛不相及吧。换了N多版本,时间,地点,都一样——白扯阿。难道这个也能被GFW“干”了?操的,这个要是干了,我看这个“contory”也快被“操”了(contory好像拼错了吧,哈哈)
  • 2007-1-4 13:27:10
  • 7.L.H.
  • 6楼的,不要什么事都说是GFW。
    虽然有许多事情你并不满意,有许多事情不是我们能左右,但你不要忘记你现在说的,写的,都是中文。你想去到哪?即使USA,JP,相信会有更多的事情让你不爽。做个理智的人好过点。全部归于GFW的“功劳”让人感觉你很幼稚。
    P.S:这个网站似乎总是仇视中国吧?继续好了,有能力者,叫你爸爸妈妈也不叫中国人,你自己也说外语好了。
    ----往下,可能又有人说我挨洗脑得严重了吧?~别以为人人会像你那样不分事实迎头就是洗脑洗脑的~~
  • 2007-1-4 16:32:27
  • 8.eee111
  • 6楼 很荣幸的告诉你就是地震的原因 你既然以前没用过TOR就别太望下定论。。。自作聪明也得换个地方
    7楼 政治的东西我懒得说 我只想问你一句 你写中文说中文跟GF有什么关系。。。5000年的历史文化 我今天能写能说中文全是GF的结果。。。
  • 2007-1-19 9:24:33
  • 9.xiaowei
  • 我按照你的代码写批处理时遇到了问题
    set Axis_Lib=D:\work\edu\sourcecode\v.85\web\WEB-INF\lib
    set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
    set Output_Path=D:\test
    set Package=com.google.api
    %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% GoogleSearch.wsdl


    Axis_Lib是我axis所在的目录
    Output_Path是生成java文件的目录
    这是我的理解 ,所以只修改了这两个,但还是报了错
    我把错也贴了出来,向你请教一下
    WARN - JavaUtils.isAttachmentSupported(1308) | Unable to find required classes (
    javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment
    support is disabled.
  • 2007-5-30 13:33:42
  • 10.CLK
  • 感谢提供的信息,可惜谷歌以停止发上述Key了,我想做一个可以自动用多个关键词同时查询不同搜索引擎的工具,并且将第一页的结果同时存储下来。想请教是否可以指点如何做。感谢。
  • 2007-7-26 18:30:22
  • 11.又帅又可爱
  • http://www.gzcost.com
  • - Unable to find required classes (javax.activation.DataHandler and javax.mail.i
    nternet.MimeMultipart). Attachment support is disabled.
    WSDLException (at /wsdl:definitions/types): faultCode=INVALID_WSDL: Encountered
    illegal extension element 'types' in the context of a 'javax.wsdl.Definition'. E
    xtension elements must be in a namespace other than WSDL's.:
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseExtensibilityElement(Unknown Sou
    rce)
    ...
    生成客户端代码出现这种错误!
  • 2007-11-8 17:04:35

发表评论:

◎声明:转载本文时请务必以超链接形式标明文章原始出处和作者,本文严禁商业网站转载。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 通过Google订阅本站
  • 通过鲜果订阅本站
  • 通过抓虾订阅本站
  • 通过电子邮件订阅本站

站内搜索


热文排行

最新评论

最近发表

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.

This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.