作者:Dflying Chen (http://dflying.cnblogs.com/)
在前一篇貼子(在ASP.Net Atlas中調用Web Service——創建Mashup調用遠端Web Service(Yahoo!天氣實例))中我介紹了使用BridgeRestProxy對Web Service進行Mashup。然而,在實際開發中這種簡單的方法往往是不夠用的,我們需要書寫程序代碼來完成一些復雜邏輯。也就是使用自定義的復雜的Proxy Class,而不是Atlas內建的那幾種加上一些asbx文件中的XML標記。今天我們來接觸一個更復雜的例子:對Google的Search Service進行Mashup,以學習使用自定義的Class來代理對遠端Web Service的調用。
首先,讓我們了解一下Google提供的Service:Google提供給我們開發者一系列的API,您可以到http://api.google.com/查看,對於我們今天要使用的Search API,您還可以到http://api.google.com/googleapi.zip下載它的幫助文檔以及示例程序。在開始這個實例之前,我們必須到http://api.google.com/申請一個Google的License Key,並在每一次對Google的請求中包含這個Key。我大概看了一下Google的文檔,上面說每個License Key每天只允許1000個請求,這樣如果需要在大型的網站上使用Google的Search,恐怕要准備一堆的License Key了……Google可真夠小氣的-_-b。
License Key申請好,我們就可以開始了,當然,如果您是第一次接觸Mashup,可能還要參考一下我的這篇文章:在ASP.Net Atlas中調用Web Service——創建Mashup調用遠端Web Service(基礎知識以及簡單示例)。
首先,使用Visual Studio自帶的wsdl.exe工具,根據Google Web Service的wsdl地址生成出調用它的C#代碼:
wsdl.exe http://api.google.com/GoogleSearch.wsdl
將生成的GoogleSearchService.cs加到我們的Web Site的App_Code目錄中。到這時,我們其實就可以直接使用這個文件中的類了,其中GoogleSearchService.doGoogleSearch()就是我們需要的方法。不過觀察一下這個自動生成的亂糟糟的類,其中有好多別的方法,doGoogleSearch()方法也需要好多參數,所以還是先對這個亂糟糟的文件來個包裝,封裝並簡化一下對它的調用。
在這個示例程序中,對於每條搜索結果,我們只要得到它的Title,URL以及Snippet三個字段。為了減少網絡流量,我們不使用GoogleSearchService.cs中自帶的搜索結果的類,而是自定義一個只包含我們需要內容的SearchResultLite Class:
public class SearchResultLite
{
private string _title;
public string Title
{
get { return _title; }
set { _title = value; }
}
private string _url;
public string Url
{
get { return _url; }
set { _url = value; }
}
private string _snippet;
public string Snippet
{
get { return _snippet; }
set { _snippet = value; }
}
public SearchResultLite()
{
}
public SearchResultLite(string title, string url, string snippet)
{
_title = title;
_url = url;
_snippet = snippet;
}
}
注意上面的SearchResultLite Class中一定要有一個默認的無參的構造函數,並且每一個字段都要使用屬性而不是public的成員,否則Atlas在做與JavaScript對象的轉換過程中會出錯。
下面來對GoogleSearchService.doGoogleSearch()進行包裝:
public class GoogleSearchWarpper
{
public SearchResultLite[] Search(string lisenceKey, string query)
{
&nbs
p; GoogleSearchService s = new GoogleSearchService();
GoogleSearchResult result = s.doGoogleSearch(
lisenceKey,
query,
0,
10,
false,
"",
false,
"",
"",
""
);
List<SearchResultLite> resultLites = new List<SearchResultLite>();
foreach (ResultElement elem in result.resultElements)
{
SearchResultLite resultLite = new SearchResultLite(elem.title, elem.URL, elem.snippet);
resultLites.Add(resultLite);
}
return resultLites.ToArray();
}
}
這樣我們在調用Search方法的時候只需要兩個參數即可,並且返回的數據也沒有冗余的部分。將其存為GoogleSearchWarpper.cs。
接下來我們要在web.config文件中添加開頭申請到的License Key,在後面的步驟中會用到:
<aPPSettings>
<add key="GoogleWebAPILisenceKey" value="!!input your license key here!!"/>
</aPPSettings>
下面來看Bridge文件GoogleSearchBridge.asbx的聲明:
<?XML version="1.0" encoding="utf-8" ?>
<bridge namespace="Dflying" className="GoogleSearch" >
<proxy type="GoogleSearchWarpper, App_Code" />
<method name="Search">
<input>
<parameter name="lisenceKey" value="% aPPSettings : GoogleWebAPILisenceKey %" serverOnly="true" />
<parameter name="query" />
</input>
</method>
</bridge>
注意到<proxy>段的type屬性值被指定為在App_Code中的GoogleSearchWarpper類,也就是使用我們剛剛定義的Proxy對象。對於Search的兩個參數:
licenseKey的value屬性值設置為% appsettings : GoogleWebAPILisenceKey %,這是asbx文件中引入的一個新寫法,代表在運行時它的值將被指派為web.config文件中aPPSettings段中key為GoogleWebAPILisenceKey的值。
query將由客戶端傳過來,代表查詢的關鍵字。
到此為止,我們可以在Atlas頁面中測試一下了,當然第一步還是在頁面上添加ScriptManager,還有對上面Bridge的引用:
<atlas:ScriptManager ID="scriptManager" runat="server">
&n
bsp; <Services>
<atlas:ServiceReference Path="GoogleSearchBridge.asbx" />
</Services>
</atlas:ScriptManager>
在添加一段Html,用來讓用戶輸入查詢關鍵字,引發查詢並顯示結果:
<input id="tbQuery" type="text" />
<input id="btnSearch" type="button" value="Search!" onclick="return btnSearch_onclick()" />
<div id="result">
</div>
最後,編寫JavaScript,可以看到其中對Sys.StringBuilder的使用:
function btnSearch_onclick() {
var tbQuery = new Sys.UI.TextBox($("tbQuery"));
Dflying.GoogleSearch.Search({'query': tbQuery.get_text()}, onSearchComplete);
}
function onSearchComplete(result) {
var sbResult = new Sys.StringBuilder();
for (var i = 0; i < result.length; ++i) {
sbResult.append("<hr />");
sbResult.append("<b>" + result[i].Title + "</b><br />");
sbResult.append("<a href=\"" + result[i].Url + "\" target=\"_blank\" >" + result[i].Url + "</a><br />");
sbResult.append(result[i].Snippet);
}
$('result').innerHtml = sbResult.toString();
}
示例程序可以在此下載:http://www.cnblogs.com/Files/dflying/GoogleSearchBridge.zip
注意:想運行這個示例程序,您需要在web.config中的GoogleWebAPILisenceKey部分填入您申請好的License Key。