Restletとjson-lib を使ったWebサービスへのアクセス

前回の内容は、標準Java APIを使用を使用してテクノラティのWebサービスにアクセスしました。今回は、前々回で紹介した標準Java API以外のライブラリを利用して、Webサービスにアクセスしてみたいと思います。
今回は、前々回も紹介したRestletとjson-libを用います。Webサービスを呼ぶのに、Restlet を使い、返ってきた JSONをパースしてJavaのオブジェクトにするのに、json-lib を用いています。
Restletは、RESTfulなサービスを作成するためのライブラリですが、クライアントとして用いて、RESTful なサービスにアクセスする機能も存在しています。
今回サンプルとして作成するものですが、前回は、「イベント検索アプリケーション」にあるイベントに関連したブログエントリも、イベント情報として提示するために、テクノラティのWebサービスを使ってブログ検索をしましたが、今回は、そのテクノラティのWebサービスを使って検索されたブログが、はてなブックマークでどのぐらいブックーマークされているのかを表示するように、前回のコードに追加したいと思います。複数のサービスを利用し、求める機能を作成するのもマッシュアップらしいコードと言えるでしょう。
はてなブックマークに関する情報を得るAPI(以降はてなブックマークエントリー情報取得APIと呼びます)は、テクノラティのサービスと違ってメンバー登録しないでも利用できます。
「http://b.hatena.ne.jp/entry/json/http://www.hatena.ne.jp/」といったように、「http://b.hatena.ne.jp/entry/json/+ブックマーク数を知りたいURL」というように、RESTfulライクにアクセスすることで、JSONの形式で、指定したURLのはてなブックーマークされている数(以降はてブ数と呼びます)や、コメントの配列を得ることができます。
以下にはてなブックマークエントリー情報取得APIで検索した結果のJSONの例を示します( http://www.hatena.ne.jp/ に対してブックマークされてる情報を取得した場合)
({"count":"1495",
"url":"http://www.hatena.ne.jp/",
"bookmarks":[{"timestamp":"2008/02/24 18:22:27","comment":"","user":"user1","tags":[]},
{"timestamp":"2008/02/24 18:09:36","comment":"","user":"user2","tags":[]}
~ 途中略 ~
})
APIの仕様の詳細は、はてなのサイトを参照してください。
早速ですが、今回のサンプルを提示します。まずは、前回のサンプルにあった、検索結果を格納するクラスである Weblogクラスに、はてブ数を入れるための、int型のフィールドとそれに対するgetter/setterを用意します。
コード1 検索結果を格納するクラス
public class Weblog {
private String name;
private String url;
private String title;
private String permalink;
private int hatebuCount;
~ 途中略 ~
public int getHatebuCount() {
return hatebuCount;
}
public void setHatebuCount(int count) {
this.hatebuCount = count;
}
}
次に、今回作るはてブ数検索をするためのインタフェースを決定します。今回はブログのurlを渡すと、はてブ数が返ってくるようなメソッドを定義します。
コード2 はてブ数検索インタフェース
package jp.tkrb.event.services;
public interface HatebuCountSearch {
public int search(String url);
}
package jp.tkrb.event.services;
import java.io.IOException;
import org.restlet.Client;
import org.restlet.data.Protocol;
import net.sf.json.JSON;
import net.sf.json.JSONNull;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
public class HatebuCountSearchImpl implements HatebuCountSearch {
public int search(String url) {
try {
Client client = new Client(Protocol.HTTP);
String jsonStr = client.get("http://b.hatena.ne.jp/entry/json/" + url).getEntity().getText();
JSON jsonObj = JSONSerializer.toJSON(jsonStr.substring(1, jsonStr.length() - 1));
if (jsonObj instanceof JSONNull) {
return 0;
}
return ((JSONObject)jsonObj).getInt("count");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
今回は標準Java API以外を使っているので、各々のライブラリをダウンロードし、必要な jar ファイルをクラスパスに通す必要があります。
Restlet は、こちらの Restlet のサイトの「Download」から本稿執筆時点で最新の1.0.7のファイルをダウンロードし、ダウンロードしたファイルのlibフォルダ直下の以下のファイルをクラスパスに入れてください。- org.restlet-1.0.7.jar
- com.noelios.restlet-1.0.7.jar
- com.noelios.restlet.ext.net-1.0.7.jar
- Jakarta Commons Lang 2.3
- Jakarta Commons BeanUtils 1.7.0
- Jakarta Commons Collections 3.2
- Jakarta Commons Logging 1.1
- EZMorph 1.0.4
Client client = new Client(Protocol.HTTP);
String jsonStr = client.get("http://b.hatena.ne.jp/entry/json/" + url).getEntity().getText();
RestletのClientクラスのオブジェクトをプロトコルを指定して生成し、そのオブジェクトを利用して、はてなブックマークエントリー情報取得APIにアクセスし、その結果を文字列として取得しています。
Restletでは、簡単に様々なプロトコルや、様々な返却方式を扱うことができます。たとえば、XMLを返すようなサービスを利用する場合には、
DomRepresentation domRepresentation = client.get( "http://example.com/service" ).getEntityAsDom();
といったコーディングをすることで、XMLが返却された場合に、DOM オブジェクトを生成してアクセスすることが可能になります。 今回、得られた文字列はJSON形式なので、Javaで扱うために、json-libを使います。
JSON jsonObj = JSONSerializer.toJSON(jsonStr.substring(1, jsonStr.length() - 1));
if (jsonObj instanceof JSONNull) {
return 0;
}
return ((JSONObject)jsonObj).getInt("count");
次に、JSONSerializer.toJSON に小括弧を削除したJSON文字列を渡し、パースしてもらい、json-libのJSONクラスのオブジェクトに変換してもらいます。
JSONNullとinstanceofで比較しているコードは、はてブ数が0だった場合に、はてなブックマークエントリー情報取得APIが「(null)」という文字列を返すための対応です。はてブ数が0以上の場合は、countというプロパティにはてブ数が入っているので、その値を取り出して返しています。
TechnoratiBlogSearch technoratiBlogSearch = new TechnoratiBlogSearchSimpleImpl();
HatebuCountSearch hatebuSearch = new HatebuCountSearchImpl();
List
for (Weblog weblog:weblogs) {
int count = hatebuSearch.search(weblog.getPermalink());
weblog.setHatebuCount(count);
}
以上で今回のJavaの標準API以外のライブラリを使って、Webサービスを呼び出してサーバサイドマッシュアップするサンプルは終了です。各種ライブラリを使うことで比較的簡単にサービスを呼び出し、その結果としてのJavaオブジェクトを取得することができるのがお分かりいただけたでしょうか。今回取り上げたもの以外にも、Webサービスを呼び出すのに適したライブラリが沢山あるので他のものについても色々と使ってみてください。
トラックバック
必ず利用規約をお読み頂き、同意の上、送信してください。
また、トラックバック元・リンク先の内容にはリクルートは一切責任を負いません。
この一覧は、次のエントリーを参照しています: Restletとjson-lib を使ったWebサービスへのアクセス:




最近のコメント