著者: Dflying Chen ( http://dflying.cnblogs.com/ )
前回の投稿 (ASP.NET Atlas での Web サービスの呼び出し - リモート Web サービス (Yahoo! Weather インスタンス) を呼び出すマッシュアップの作成) では、Web サービス上でマッシュアップを実行するための BridgeRestProxy の使用を紹介しました。ただし、実際の開発では、この単純な方法では十分ではないことが多く、複雑なロジックを完成させるためにプログラム コードを作成する必要があります。つまり、Atlas の組み込みプロキシ クラスと asbx ファイル内のいくつかの XML タグの代わりに、カスタムの複雑なプロキシ クラスを使用します。今日は、より複雑な例を取り上げます。Google の検索サービスをマッシュアップして、カスタム クラスを使用してリモート Web サービスへの呼び出しをプロキシする方法を学習します。
まず、Google が提供するサービスを見てみましょう。Google は開発者に一連の API を提供しています。これらの API は、 http://api.google.com/ で確認できます。今回使用する Search API については、 http://api.google.com/Apply for a Google License Key にアクセスし、Google へのすべてのリクエストにこのキーを含めることもできます。 Google のドキュメントを見てみると、各ライセンス キーで許可されるリクエストは 1 日あたり 1,000 件までと記載されており、大規模な Web サイトで Google の検索を使用する必要がある場合は、大量のライセンス キーを用意する必要があると思います。 . Google は本当に十分です ケチ-_-b。
もちろん、ライセンス キーを申請した後、マッシュアップを初めて使用する場合は、私の記事「ASP.NET Atlas での Web サービスの呼び出し - マッシュアップの作成」を参照してください。リモート Web サービスを呼び出す (基本と簡単な例)。
まず、Visual Studio に付属の wsdl.exe ツールを使用して、wsdl アドレスに基づいて Google Web サービスを呼び出す C# コードを生成します。
wsdl.exe http://api.google.com/GoogleSearch.wsdl は
GoogleSearchService.cs を生成します。これを Web サイトの App_Code ディレクトリに追加します。この時点で、このファイル内のクラスを実際に直接使用できます。その中で必要なメソッドは GoogleSearchService.doGoogleSearch() です。しかし、この自動生成された乱雑なクラスを見てください。このクラスには他にも多くのメソッドがあり、doGoogleSearch() メソッドにも多くのパラメータが必要なので、最初にこの乱雑なファイルをラップし、その呼び出しをカプセル化して簡素化する必要があります。
このサンプル プログラムでは、検索結果ごとに、タイトル、URL、およびスニペットのフィールドを取得するだけで済みます。ネットワーク トラフィックを減らすために、GoogleSearchService.cs に付属の検索結果クラスを使用せず、必要なコンテンツのみを含む SearchResultLite クラスをカスタマイズします。
public class SearchResultLite
{
プライベート文字列_title;
パブリック文字列 タイトル
{
{ return _title } を取得します。
セット { _title = 値 }
プライベート文字列_url
;
パブリック文字列 URL
{
{ _url を返す } を取得します。
セット { _url = 値 }
プライベート
文字列 _snippet;
パブリック文字列のスニペット
{
取得 { return _snippet }
セット { _snippet = 値 }
public SearchResultLite(
)
{
public SearchResultLite(文字列タイトル、文字列URL、文字列スニペット
)
{
_title = タイトル;
_url = URL;
_snippet = スニペット;
}
上記の SearchResultLite クラスにはデフォルトのパラメーターなしのコンストラクターが必要であり、各フィールドはパブリック メンバーの代わりに属性を使用する必要があることに注意してください。そうしないと、Atlas は JavaScript オブジェクトへの変換プロセス中にエラーが発生します
。
GoogleSearchService.doGoogleSearch() をラップしましょう:
public class GoogleSearchWarpper
{
public SearchResultLite[] Search(string lisenceKey, string query)
{
GoogleSearchService s = new GoogleSearchService();
GoogleSearchResult 結果 = s.doGoogleSearch(
ライセンスキー、
クエリ、
0、
10、
間違い、
「」、
間違い、
「」、
「」、
「」
);
List<SearchResultLite> resultLites = new List<SearchResultLite>();
foreach (result.resultElements の ResultElement 要素)
{
SearchResultLite resultLite = new SearchResultLite(elem.title, elem.URL, elem.snippet);
resultLites.Add(resultLite);
}
resultLites.ToArray() を返します。
}
この
方法では、Search メソッドを呼び出すときに必要なパラメーターは 2 つだけであり、返されるデータには冗長な部分がありません。 GoogleSearchWarpper.cs という名前で保存します。
次に、最初に適用したライセンス キーを web.config ファイルに追加する必要があります。これは後続の手順で使用されます:
<appSettings>
<add key="GoogleWebAPILisenceKey" value="!!ここにライセンス キーを入力してください!!"/>
</appSettings>
ブリッジ ファイル GoogleSearchBridge.asbx の宣言を見てみましょう:
<?xml version="1.0"coding="utf-8" ?>
<bridge namespace="Dflying" className="GoogleSearch" >
<proxy type="GoogleSearchWarpper, App_Code" />
<メソッド名="検索">
<入力>
<parameter name="lisenceKey" value="% appsettings : GoogleWebAPILisenceKey %" serverOnly="true" />
<パラメータ名="クエリ" />
</入力>
</メソッド>
</bridge>
<proxy> セクションの type 属性値は、App_Code の GoogleSearchWarpper クラスとして指定されていることに注意してください。つまり、先ほど定義した Proxy オブジェクトを使用しています。 Search の 2 つのパラメーターの場合:
LicenseKey の value 属性値は % appsettings: GoogleWebAPILisenceKey % に設定されます。これは、asbx ファイルに導入された新しい書き込みメソッドであり、その値が Web の appSettings セクションに割り当てられることを意味します。実行時の設定ファイルのキーは GoogleWebAPILisenceKey の値です。
クエリはクライアントから渡され、クエリのキーワードを表します。
この時点で、Atlas ページでテストできます。もちろん、最初のステップは、ScriptManager をページに追加し、上記の Bridge への参照を追加することです:
<atlas:ScriptManager ID="scriptManager" runat="server">。
<サービス>
<atlas:ServiceReference Path="GoogleSearchBridge.asbx" />
</サービス>
</atlas:ScriptManager>
ユーザーがクエリ キーワードを入力し、クエリをトリガーし、結果を表示できるようにする HTML 部分を追加します。
<input id="tbQuery" type="text" />
<input id="btnSearch" type="button" value="検索!" onclick="return btnSearch_onclick()" />
<div id="結果">
</div>
最後に、JavaScript を作成すると、Sys.StringBuilder の使用方法がわかります。
function btnSearch_onclick() {
var tbQuery = 新しい Sys.UI.TextBox($("tbQuery"));
Dflying.GoogleSearch.Search({'クエリ': tbQuery.get_text()}, onSearchComplete);
関数 onSearchComplete(結果)
{
var sbResult = 新しい 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();
サンプル プログラムはここからダウンロードできます
。