前 言
通过本文,你将能了解到如何配置服务以及Google WebService的语法结构;怎样个性化你的搜索,例如:国家、语言;怎样提炼搜索结果。
Google目前已经成了Web上最流行的搜索引擎,为了让诸如new content watchdog、GUI搜索工具和模式分析之类的应用程序成为可能,现在它们为20亿个页面建立了索引,开发者们可以通过基于SOAP的API进行调用。
WebService 简介
Web应用的巨大成功和不断发展,使其渗透到商业领域和个人生活的各个方面。人们只要使用浏览器,就可以享受到各种各样的Web服务,例如网上购物,网上交易,网络游戏,预定车票,网上聊天和交友等等。与此同时,由于Web技术所带来的优势(统一的客户端和较好的维护性),使一些传统的应用纷纷转型到基于B/S架构的瘦客户端应用程序,这是因为它能够避免花在桌面应用程序发布上的高成本,也能够很好的解决客户和服务器之间的通信问题。在客户端和服务器之间的通信,一个完美的解决方案是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都使用HTTP协议,可以很好地透过防火墙进行通信。许多商业程序还面临另一个问题,那就是与其他程序的互操作性。目前有很多商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放,并由COBOL语言编写的大型机程序访问。而且,还有很多商业程序使用C++、JAVA、VB和其他各种各样的语言编写。现在初了最简单的程序之外,所有的程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。在以前,没有一个应用程序通信标准是独立于平台、组建模型和编程语言的。只有通过Web Service、客户端和服务器才能够自由的用HTTP进行通信,不论两个程序的平台和编程语言是什么。Web Service技术完全基于标准的技术,只有基于标准,所有的开放厂商才能有相同的标准,才能够在各自的平台上开发出具有跨平台互操作能力的软件产品和解决方案。标准时达成跨平台互操作能力的灵魂。
Web是为了程序到用户的交互,而Web Service是为程序到程序的交互做准备。Web Service使公司可以降低进行电子商务的成本、更快的部署解决方案以及开拓新机遇。达到这个目标的关键在于通用的程序到程序通信模型,该模型应建立在现有的和新兴的标准之上。其中包括:HTTP,SOAP, WSDL, UDDI
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描述文件,起着目录服务器的作用。
快速安装
本文的运行环境是JDK1.3+Tomcat4.0+JSP。要使用Google的服务,必须要有“license key”,可以在https://www.google.com/accounts/NewAccount?continue=http://api.google.com/createkey&followup=http://api.google.com/createkey中取得,输入相应的信息,然后到你的邮箱收取“license key”。接着还需要“Java API for XML Messaging”亦即“JAXM”。它是Java XML Pack的一部分,在http://java.sun.com/xml/downloads/javaxmlpack.html提供。
为了更简单的表达,我直接用JSP模式,并使用手工编码,没有用IDE环境。
解开刚才下载的java_xml_pack-summer02_01.zip,找到java_xml_pack-summer-02_01/jaxp-1.2_01/xalan.jar文件,用WinRAR解开把org文件夹拷贝到你的应用程序的WEB-INF/classes下。找到java_xml_pack-summer-02_01/jaxm-1.1_01/lib/saaj-api.jar文件,解开它并拷贝javax文件夹到同上的目录。找到java_xml_pack-summer-02_01/jaxm-1.1_01/lib/jaxm-api.jar文件,解开它并拷贝javax文件夹到相同目录。找到java_xml_pack-summer-02_01/jaxp-1.2_01/jaxp-api.jar文件,解开它并拷贝javax文件夹到相同目录。找到java_xml_pack-summer-02_01/jaxm-1.1_01/jaxm/saaj-ri.jar文件,解开并拷贝com文件夹到相同目录。
程序源代码
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="org.apache.xalan.processor.TransformerFactoryImpl"%>
<%@ page import="javax.xml.soap.SOAPConnectionFactory"%>
<%@ page import="javax.xml.soap.SOAPConnection"%>
<%@ page import="javax.xml.soap.MessageFactory"%>
<%@ page import="javax.xml.soap.SOAPMessage"%>
<%@ page import="javax.xml.soap.SOAPPart"%>
<%@ page import="javax.xml.soap.SOAPEnvelope"%>
<%@ page import="javax.xml.soap.SOAPBody"%>
<%@ page import="javax.xml.soap.SOAPElement"%>
<%@ page import="java.io.FileInputStream"%>
<%@ page import="javax.xml.transform.stream.StreamSource"%>
<%@ page import="javax.xml.messaging.URLEndpoint"%>
<%@ page import="javax.xml.transform.TransformerFactory"%>
<%@ page import="javax.xml.transform.Transformer"%>
<%@ page import="javax.xml.transform.Source"%>
<%@ page import="javax.xml.transform.stream.StreamResult"%>
<html>
<head>
<title>google WebService</title>
</head>
<%
try {
//首先建立一个连接
SOAPConnectionFactory soapConnFactory =
SOAPConnectionFactory.newInstance();
SOAPConnection connection =
soapConnFactory.createConnection();
//接着,创建消息
MessageFactory messageFactory=MessageFactory.newInstance();
SOAPMessage message=messageFactory.createMessage();
//为消息部份创建SOAP对象
SOAPPart soapPart=message.getSOAPPart();
//组装信息,根据C盘根目录下search.msg文件进行搜索
StreamSource preppedMsgSrc=new StreamSource(new FileInputStream("/search.msg"));
soapPart.setContent(preppedMsgSrc);
//保存消息
message.saveChanges();
//发送到目标地址
URLEndpoint destination=
new URLEndpoint("http://api.google.com/search/beta2");
//发送消息
SOAPMessage reply=connection.call(message, destination);
//保存输出,建立传出信息
TransformerFactory transformerFactory =
TransformerFactory.newInstance();
//根据样式文件translate.xsl进行解析
Source styleSheet=new StreamSource("/translate.xsl");
Transformer transformer=
transformerFactory.newTransformer(styleSheet);
//提取收到的内容
Source sourceContent=reply.getSOAPPart().getContent();
//建立输出文件results.out
StreamResult result=new StreamResult("/results.out");
transformer.transform(sourceContent, result);
out.println("文件已生成C:/results.out");
//关闭连接
connection.close();
}catch(Exception e){
System.out.println(e.getMessage());
}
%>
</body>
</html>
源代码部分完全按照Google的规定进行编写,程序注解部分也在其中,这里就不罗嗦了。
搜索格式
<?xml version=''1.0'' encoding=''UTF-8''?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<key xsi:type="xsd:string">00000000000000000000000000000000</key>
<q xsi:type="xsd:string">CSDN论坛</q>
<start xsi:type="xsd:int">0</start>
<maxResults xsi:type="xsd:int">10</maxResults>
<filter xsi:type="xsd:boolean">false</filter>
<restrict xsi:type="xsd:string"></restrict>
<safeSearch xsi:type="xsd:boolean">false</safeSearch>
<lr xsi:type="xsd:string"></lr>
<ie xsi:type="xsd:string">latin1</ie>
<oe xsi:type="xsd:string">latin1</oe>
</ns1:doGoogleSearch>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
search.msg文件标签<<key></key>之前的为固定格式,无需费心。标签<key>就是本文第一部分所提到的“license key”,直接复制过来。标签<q>是指具体要搜索的内容。标签<start>是指从第几个开始搜索。标签<maxResults>是指每次返回搜索结果的最大值,Google WebService规定,最大值只能是“10”。标签<filter>是指过滤掉结果中相似和域名相同的结果。标签<restrict>是指国家和主题的约束,例如要限制只在国内搜索,就需要输入countryCN;要限制只在Linux主题内搜索,就输入linux。标签<safeSearch>过滤掉成人信息。标签<lr>搜索的语言,例如只搜索简体中文,就要输入lang_zh-CN。标签<ie>和<oe>分别指输入和输出的编码格式默认为latin1(UTF-8)。
解析格式
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="//item"/>
</xsl:template>
<xsl:template match="item">
<xsl:value-of select="title" disable-output-escaping="yes"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="URL"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="summary"/>
</xsl:template>
</xsl:stylesheet>
translate.xsl文件。我们从<xsl:value-of select="title" disable-output-escaping="yes"/>这一句开始,select="title"确定了返回结果的第一部分为标题。接下来,select="URL"解析出URL地址。<xsl:text></xsl:text>暂且理解为换行标签吧。select="summary"解析出摘要。还有一些标签,详情请参考“Google Web APIs Reference”。
后 记
程序运行以后所产生的结果results.out请大家自己去查看,在这里就不一一列举了。
创作这篇文章的目的纯属个人爱好,完全是对Google引擎的一种喜爱。文章不是很有深度,希望能给各位起到抛砖引玉的作用我就满足了,更加丰富的功能还有待我们去探索!