Flickr API を GWT 2.1 で使用してみる

12月 30, 2010   //   by rssfeeder   //   ETH  //  Flickr API を GWT 2.1 で使用してみる はコメントを受け付けていません

最近、oxoxo [ゼロバイゼロ]のサイトを流行りのHTML5&GWTでつくろうと奮闘中。その備忘録。
■Google Web Toolkit 2.1.1で、JSONP を利用して、flickrへの呼び出し(photosetの取得)を以下のように実装してみた。

・準備

※GWTでJSONPを使う方法は、

http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/gwt/jsonp/client/JsonpRequestBuilder.html

<ProjectName>.gwt.xmlに、

<inherits name=’com.google.gwt.jsonp.Jsonp’/>

を追加する。そうしないと、

No source code is available for type
com.google.gwt.jsonp.client.JsonpRequestBuilder; did you forget to inherit
a required module?

と、実行時に怒られる。最初、web.xmlに追加していてハマった。。

・呼び出し

JsonpRequestBuilder builder = new JsonpRequestBuilder();

builder.setCallbackParam("jsoncallback"); // [1]

builder.requestObject(FLICKR_PHOTOSET_URL, // [2]
new AsyncCallback&lt;FlickrRsp&gt;() {

public void onFailure(Throwable caught) {
//…
}

public void onSuccess(FlickrRsp result) {
JsArray&lt;FlickrPhoto&gt; photos = result.getPhotos();
String debugOut = "ids: ";
for(int i=0; i &lt; photos.length(); i++) {
FlickrPhoto photo = photos.get(i);
debugOut += photo.getId();
}
dbgLabel.setText(debugOut);
dbgLabel.setVisible(true);
}

});
}
//…

[1]callback関数を変更する必要がある。

理由:

例えば[2]でセットするURLを、以下のように定義したとする。

static final String FLICKR_PHOTOSET_URL =
"http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&amp;format=json&amp;api_key=xx&amp;photoset_id=xx";

すると、GWTは実行時に以下のようなHTTP GETリクエストを発行する。fireBugとCocoaPacketAnalyzerで確認。

GET /services/rest/?method=flickr.photosets.getPhotos&format=json&api_key=xx&photoset_id=xx&callback=__gwt_jsonp__.I0.onSuccess

要は、末尾にcallbackを指定するパラメータを勝手に付加するらしい。
しかし、flickr APIのデフォルトのコールバック関数名は、jsonFlickrApi なので、関数名が一致せず、コールバックが呼び出されず、TIMEOUTしてしまう。onFailure() が呼ばれる。

Failed to send the message. Timeout while calling <url>.

そのため、先述のsetCallbackParamで、”jsoncallback”を入れる必要がある。
jsoncallback については、 http://www.flickr.com/services/api/response.json.html

そうすると、以下のようなHTTP GETリクエストが発行され、onSuccess() がコールされるようになる。

GET /services/rest/?method=flickr.photosets.getPhotos&format=json&api_key=xx&photoset_id=xx&jsoncallback=__gwt_jsonp__.I0.onSuccess

Comments are closed.

Archives