前 言
通過本文,你將能了解到如何配置服務以及Google WebService的語法結構;怎樣個性化你的搜索,例如:國家、語言;怎樣提煉搜索結果。
Google目前已經成了Web上最流行的搜索引擎,為了讓諸如new content watchdog、GUI搜索工具和模式分析之類的應用程序成為可能,現在它們?yōu)?0億個頁面建立了索引,開發(fā)者們可以通過基于SOAP的API進行調用。
WebService 簡介
Web應用的巨大成功和不斷發(fā)展,使其滲透到商業(yè)領域和個人生活的各個方面。人們只要使用瀏覽器,就可以享受到各種各樣的Web服務,例如網上購物,網上交易,網絡游戲,預定車票,網上聊天和交友等等。與此同時,由于Web技術所帶來的優(yōu)勢(統(tǒng)一的客戶端和較好的維護性),使一些傳統(tǒng)的應用紛紛轉型到基于B/S架構的瘦客戶端應用程序,這是因為它能夠避免花在桌面應用程序發(fā)布上的高成本,也能夠很好的解決客戶和服務器之間的通信問題。在客戶端和服務器之間的通信,一個完美的解決方案是使用HTTP協議來通信。這是因為任何運行Web瀏覽器的機器都使用HTTP協議,可以很好地透過防火墻進行通信。許多商業(yè)程序還面臨另一個問題,那就是與其他程序的互操作性。目前有很多商業(yè)數據仍然在大型主機上以非關系文件(VSAM)的形式存放,并由COBOL語言編寫的大型機程序訪問。而且,還有很多商業(yè)程序使用C++、JAVA、VB和其他各種各樣的語言編寫。現在初了最簡單的程序之外,所有的程序都需要與運行在其他異構平臺上的應用程序集成并進行數據交換。在以前,沒有一個應用程序通信標準是獨立于平臺、組建模型和編程語言的。只有通過Web Service、客戶端和服務器才能夠自由的用HTTP進行通信,不論兩個程序的平臺和編程語言是什么。Web Service技術完全基于標準的技術,只有基于標準,所有的開放廠商才能有相同的標準,才能夠在各自的平臺上開發(fā)出具有跨平臺互操作能力的軟件產品和解決方案。標準時達成跨平臺互操作能力的靈魂。
Web是為了程序到用戶的交互,而Web Service是為程序到程序的交互做準備。Web Service使公司可以降低進行電子商務的成本、更快的部署解決方案以及開拓新機遇。達到這個目標的關鍵在于通用的程序到程序通信模型,該模型應建立在現有的和新興的標準之上。其中包括:HTTP,SOAP, WSDL, UDDI
SOAP:是“Simple Object Access Protocol”的縮寫,SOAP是消息傳遞的協議,它規(guī)定了Web Services之間是怎樣傳遞信息的。
簡單的說,SOAP規(guī)定了:
1. 傳遞信息的格式為XML。這就使Web Services能夠在任何平臺上,用任何語言進行實現。
2. 遠程對象方法調用的格式。規(guī)定了怎樣表示被調用對象以及調用的方法名稱和參數類型等。
3. 參數類型和XML格式之間的映射。這是因為,被調用的方法有時候需要傳遞一個復雜的參數,例如,一個Person對象。怎樣用XML來表示一個對象參數,也是SOAP所定義的范圍。
WSDL:是“Web Services Description Language”的縮寫。WSDL是Web Services的定義語言。當實現了某種服務的時候(如:股票查詢服務),為了讓別的程序調用,必須告訴大家服務接口。例如:服務名稱,服務所在的機器名稱,監(jiān)聽端口號,傳遞參數的類型,個數和順序,返回結果的類型等等。這樣別的應用程序才能調用該服務。WSDL協議就是規(guī)定了有關Web Services描述的標準。
UDDI:是“Universal Description, Discovery,and Integration”的縮寫。簡單說,UDDI用于集中存放和查找WSDL描述文件,起著目錄服務器的作用。
快速安裝
本文的運行環(huán)境是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環(huán)境。
解開剛才下載的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();
//接著,創(chuàng)建消息
MessageFactory messageFactory=MessageFactory.newInstance();
SOAPMessage message=messageFactory.createMessage();
//為消息部份創(chuàng)建SOAP對象
SOAPPart soapPart=message.getSOAPPart();
//組裝信息,根據C盤根目錄下search.msg文件進行搜索
StreamSource preppedMsgSrc=new StreamSource(new FileInputStream("/search.msg"));
soapPart.setContent(preppedMsgSrc);
//保存消息
message.saveChanges();
//發(fā)送到目標地址
URLEndpoint destination=
new URLEndpoint("http://api.google.com/search/beta2");
//發(fā)送消息
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的規(guī)定進行編寫,程序注解部分也在其中,這里就不羅嗦了。
搜索格式
<?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規(guī)定,最大值只能是“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="http://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請大家自己去查看,在這里就不一一列舉了。
創(chuàng)作這篇文章的目的純屬個人愛好,完全是對Google引擎的一種喜愛。文章不是很有深度,希望能給各位起到拋磚引玉的作用我就滿足了,更加豐富的功能還有待我們去探索!