« 楽天API+SWFAddress2.0を利用したストアのマッシュアップ | メイン | lightboxをカスタマイズしてみよう(中編)- 角丸対応ライブラリとCanvas »

Restletとjson-lib を使ったWebサービスへのアクセスはてなブックマークに追加 livedoorクリップに追加 Yahoo!ブックマークに追加 del.icio.usに追加 イザ!ブックマーク ニフティクリップに追加

前回の内容は、標準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);
}

次に、このインタフェースを実装して、はてなブックマークエントリー情報取得APIからはてブ数を実際に取得する実装クラスを示します。 コード3 Restlet と json-lib を使った実装コード

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
json-lib はこちらのjson-lib の SourceFourge のサイトからダウンロードしてクラスパスに入れてください。 また、json-lib は以下のライブラリに依存しているので、それらもそれぞれダウンロードしてクラスパスに入れてください。 実装コードを部分的に見ていきましょう。まずは、はてなブックマークエントリー情報取得APIにアクセスするコードです。

            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");

最初に、「jsonStr.substring(1, jsonStr.length() - 1)」と文字列操作してる部分について説明します。この部分は、はてなが返すJSONの形式が前述の通りに「(」と小括弧で始まり、「)」と小括弧で終っているためです。ブラウザでevalしてこのJSONを使う場合には問題ないのですが、json-libでは扱えないため最初と最後の小括弧を削除しています。

次に、JSONSerializer.toJSON に小括弧を削除したJSON文字列を渡し、パースしてもらい、json-libのJSONクラスのオブジェクトに変換してもらいます。
JSONNullとinstanceofで比較しているコードは、はてブ数が0だった場合に、はてなブックマークエントリー情報取得APIが「(null)」という文字列を返すための対応です。はてブ数が0以上の場合は、countというプロパティにはてブ数が入っているので、その値を取り出して返しています。

最後に、前回作成したテクノラティのサービスを呼び出した結果を使って、ブログのURLからはてブ数を求めるためのコードを示します。

        TechnoratiBlogSearch technoratiBlogSearch = new TechnoratiBlogSearchSimpleImpl();
        HatebuCountSearch hatebuSearch = new HatebuCountSearchImpl();

        List weblogs = technoratiBlogSearch.search("デブサミ");
        for (Weblog weblog:weblogs) {
            int count = hatebuSearch.search(weblog.getPermalink());
            weblog.setHatebuCount(count);
        }

サンプルなので、テクノラティのサービスと、はてなのサービスにアクセスしに行く実装クラスを直接 new していますが、実際にはDI管理などにする点にご注意ください。 このコードでは、前回作成したTechnoratiBlogSearchを呼び出して、「デブサミ」に関するブログを検索し、結果のリストからURLを取り出して、はてブ数を、今回作ったサービスに渡して検索して、それを格納しています。

以上で今回のJavaの標準API以外のライブラリを使って、Webサービスを呼び出してサーバサイドマッシュアップするサンプルは終了です。各種ライブラリを使うことで比較的簡単にサービスを呼び出し、その結果としてのJavaオブジェクトを取得することができるのがお分かりいただけたでしょうか。今回取り上げたもの以外にも、Webサービスを呼び出すのに適したライブラリが沢山あるので他のものについても色々と使ってみてください。

トラックバック

必ず利用規約をお読み頂き、同意の上、送信してください。
また、トラックバック元・リンク先の内容にはリクルートは一切責任を負いません。

この一覧は、次のエントリーを参照しています: Restletとjson-lib を使ったWebサービスへのアクセス:

» WEB API 送信元 デブウィキ(Devwiki) - 開発Tips (PukiWiki/TrackBack 0.3)
Webサービスとは Webサービスの種類 SOAP RESTful REST準拠 過去の技術 WSDL(Web... [詳しくはこちら]