RubyはFlickrが大好き
ボタンクリックをRubyにフックする方法は分かったので,Flickrと話して検索結果のデータを取得するようにしよう。まず最初に,Flickrとの通信方法を知る必要がある。initializeを以下のように変える。
def initialize @url = "http://api.flickr.com/services/rest" @options = { :method => "flickr.photos.search", :format => "json", :nojsoncallback => "1", :api_key => "6dba7971b2abf352b9dcd48a2e5a5921", :sort => "relevance", :per_page => "30" } document.submit_search.onclick do |s, e| create(document.keyword.value, 1) end end
我々は分別のある大人なので,FlickrとはRESTで通信する。@optionsハッシュは,RESTの呼び出しに必要な様々なパーツを集めたものだ。我々は後でこれをURLにする関数を作る。重要なのは,我々がflickr.photos.searchを呼び出し,レスポンスとしてJSONを要求するということだ。onclickイベントは,神秘的な名前のcreateメソッドを呼び出す。これはまだ存在していないので,書くことにする。
def create(keyword, page) @options[:tags] = keyword @options[:page] = page request end def request make_url request = Net::WebClient.new request.download_string_completed do |sender, args| @response = args.result show end document.images_loading.style[:display] = "inline" request.download_string_async Uri.new(@url) end
createは再利用する必要がありそうだし,その引数はURIの一部としても必要なので,initializeの中で作った@optionsに追加しておく。そしてrequestメソッドを呼び出す。ここで「会話」が始まる。
最初に,@optionsからURLを作る(メソッドはすぐ作る)。そしてSystem::Windows::Net::WebClient(Silverlightの一部)のインスタンスに対して,Flickrに実際にリクエストを出すように通知している。images_loading.style[:display] = "inline" で,ロード中のインジケータが回り始める。レスポンスが帰ってきたら,showを呼び出す。これはなんか表示すべきだろうね。とりあえずレスポンスを出力して,ロード中インジケータを止める。
def show puts @response document.images_loading.style[:display] = "none" end
おっと。make_urlを作るちょうどいい頃合いだ。
def make_url first, separator = true, '?' @options.each do |key, value| separator = "&" unless first @url += "#{separator}#{key}=#{value}" first = false end end
特別なことは何も無くて,"?"と"&"と"="を正しい場所におくだけだ。まだこれだけじゃ動作しない。app.rbを保存して,検索文字を入力して,searchをクリックすると,わけの分からないものが表示される。