人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

adobeAIRのHTTPServiceについて質問です。

指定したキーワードについて、google、yahooの検索結果を取得するプログラムをAIRで構築しています。
HTTPServiceのsendプロパティを用い、google検索結果ページにアクセスします。その返り値をHTTPServiceのresultプロパティで設定した関数で受け取りDataGridに反映します。

その後、上記の動きをyahoo検索結果ページにもするのですが、DataGridに直ぐに反映されず、DataGridの右の上下する部分を動かすと反映されます。

私としては直ぐ反映されるようなシステムを作りたいのですが、無理なのでしょうか?

又、2つ,3つのサイトにアクセスし、取得したデータを1つのDataGridに表示するという方法はあまりやらないのでしょうか?

サンプルのソースはこちらです。
http://d.hatena.ne.jp/camelmasa/20080628/1214636980

宜しくお願いします。

●質問者: camelmasa
●カテゴリ:コンピュータ インターネット
✍キーワード:AIR Google Yahoo アクセス キーワード
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tdomey
●100ポイント ベストアンサー

GoogleとYahooの結果を別々にDataGridに設定するのではなく、一度にまとめて設定するのではダメでしょうか?

サンプルコードを少し変更してみました。

<?xml version="1.0" encoding="utf-8"?>
 <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="absolute"
 verticalAlign="middle" width="582" height="334">

 <mx:Script>
 <![CDATA[
 import mx.collections.ArrayCollection; 
 import mx.rpc.events.ResultEvent;
 import mx.rpc.events.FaultEvent;
 import mx.controls.Alert;
 
 //追加
 private var matchStrGoogle:Array;
 private var matchStrYahoo:Array;

 //google検索
 public function SearchGoogle():void
 {
 var uv:URLVariables = new URLVariables();
 
 if(!q.text){
 Alert.show("キーワードを入力して下さい。");
 return;
 }
 
 uv.q = q.text;//検索文字
 uv.num = "50";//検索結果数
 
 googlesearch.request = uv;
 googlesearch.send();
 }

 //yahoo検索
 public function SearchYahoo():void
 {
 var uv:URLVariables = new URLVariables();
 
 uv.p = q.text;//検索文字
 uv.n = "100";//検索結果数
 
 yahoosearch.request = uv;
 yahoosearch.send();
 }
 
 //googleへの通信成功
 public function GoogleResponce(event:ResultEvent):void
 {
 var str:String = event.result.toString();//レスポンス
 var grid:Array = new Array();
 
 var pattern:RegExp = /<h2\sclass=r><a\shref="((https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)"/g;
 var URLpattern:RegExp = /(https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/;
 
 var hit:RegExp = /<b>([0-9,]+)<\/b>/;
 
 matchStrGoogle = str.match(pattern);//google検索結果からURLを抽出
 
 /* --コメントアウト--
 //Objectを埋める
 for(var i:int=0; i<50; i++){
 var obj:Object = new Object();
 obj.id = "";
 obj.googleurl = "";
 grid[i] = obj;
 }
 
 datagrid.dataProvider = grid;
 
 for(var j:int=0; j<matchStr.length; j++){
 var word:Array;
 
 word = matchStr[j].match(URLpattern);
 if(!word[0].match(/^http:\/\/news.google.co.jp/)){
 datagrid.dataProvider[j].id = j+1;
 datagrid.dataProvider[j].googleurl = word[0];
 }
 }
 */
 
 SearchYahoo();
 }
 
 //yahooへの通信成功
 public function YahooResponce(event:ResultEvent):void
 {
 var str:String = event.result.toString();//レスポンス
 
 var pattern:RegExp = /<em\sclass="yschurl">[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#<>]+<\/em>/g;
 
 matchStrYahoo = str.match(pattern);//yahoo検索結果からURLを抽出
 
 /* --コメントアウト--
 for(var j:int=0; j<50; j++){
 var word:Array;
 var url:String = matchStr[j];
 datagrid.dataProvider[j].yahoourl = url;
 }
 */
 
 //追加
 var result:ArrayCollection = new ArrayCollection();
 for (var i:int=0; i<50; i++) {
 result.addItem({id:i+1, googleurl:matchStrGoogle[i], yahoourl:matchStrYahoo[i]});
 }
 
 datagrid.dataProvider = result;
 
 }

 //HTTP通信失敗
 public function Fault(event:FaultEvent):void
 {
 Alert.show(event.fault.faultString, "Error");
 }
]]> 
 </mx:Script>
 <mx:HTTPService
 id="googlesearch"
 method="GET"
 result="GoogleResponce(event)" 
 fault="Fault(event)"
 url="http://www.google.co.jp/search"
 resultFormat="text" />
 
 <mx:HTTPService
 id="yahoosearch"
 method="GET"
 result="YahooResponce(event)" 
 fault="Fault(event)"
 url="http://search.yahoo.co.jp/search"
 resultFormat="text" />

 <mx:ApplicationControlBar x="10" y="10" width="560" height="312" cornerRadius="4">
 </mx:ApplicationControlBar>
 
 <mx:TextInput id="q" 
 x="22" y="37" 
 width="334" height="22" />
 <mx:Button x="364" y="37" 
 label="検索" 
 click="SearchGoogle()" 
 width="74" height="22" />
 
 <mx:DataGrid id="datagrid" width="539" height="229" y="67" x="22">
 <mx:columns>
 <mx:DataGridColumn headerText="順位" dataField="id" width="40"/>
 <mx:DataGridColumn headerText="google検索結果URL" dataField="googleurl" width="130" />
 <mx:DataGridColumn headerText="yahoo検索結果URL" dataField="yahoourl" width="130" />
 </mx:columns>
 </mx:DataGrid>
 
 </mx:WindowedApplication>

<h2 class=r>など余計な文字列は取り除いていませんが、GoogleもYahooも同時に表示されると思います。

(コードの使わない部分はコメントアウトしました)

ちなみに、なぜYahooの結果がすぐに表示されないのかはよくわかりません。

元のコードをデバッガにかけて動かしてみましたが、きちんとデータは取れていました。

◎質問者からの返答

一度に表示する方法が適切なのかもしれないですね!

使わない部分も指摘いて頂いて…。嬉しいです。

有り難う御座います!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ