沢山のAPIを一律に使えるようにする
はてなjigletでは、なるべく多くのサービスに対応させるつもりなので、
なんとか沢山あるAPIをまとめて簡単に扱えないか考えた。
で、出来たのがこちら↓
public class AccessURL { public AccessURL() { hasUserID = false; hasKeyword = false; prefix = null; suffix = null; } public AccessURL(boolean hasUserID, boolean hasKeyword, String prefix, String suffix) { this.hasUserID = hasUserID; this.hasKeyword = hasKeyword; this.prefix = prefix; this.suffix = suffix; } public AccessURL(String prefix) { hasUserID = false; hasKeyword = false; this.prefix = prefix; suffix = null; } public boolean getHasUserID() { return hasUserID; } public boolean getHasKeyword() { return hasKeyword; } public String getPrefix() { return prefix; } public String getSuffix() { return suffix; } private boolean hasUserID; private boolean hasKeyword; private String prefix; private String suffix; }
hasUserIDとhasKeyword
はてなウェブサービスで提供されているAPIには、
キーワードとかユーザIDとか(あるいは両方)、こちらかの入力によってアクセスするURLが変わるのがある。
なので、利用するAPIがこちらからの入力を必要とするものなのか判定するものが必要。
prefixとsuffix
キーワードとかユーザIDとかが必要なAPIだと、
それらの入力された値をURLの途中に入れる必要がでてくる。
URLの後ろにくっつけるだけだと簡単だけど、そういうわけにもいかない。
例↓(文字化けしてるのがキーワード)
人力検索はてな - 質問一覧 - 「はてな」を含む質問
http://q.hatena.ne.jp/list?mode=rss&word=%E3%81%AF%E3%81%A6%E3%81%AAはてなブックマーク - キーワード「はてな」を含む人気エントリー
http://b.hatena.ne.jp/keyword/%e3%81%af%e3%81%a6%e3%81%aa?mode=rss&sort=countはてなアンテナ - sampleのアンテナ
http://a.hatena.ne.jp/sample/rss
なので、URLをキーワードとかを入れる部分で、2つに分割しておく。
↑のはてなアンテナの例でいうと
prefix = http://a.hatena.ne.jp/
suffix = /rss
という感じ。
こちらかの入力を必要としないAPIの場合は、prefixにURLを全部いれて、suffixにはnullをいれとく。
どのAPIも一律に扱える
これで、こちからの入力が必要なAPI、必要のないAPI、
どんなAPIでも以下のようにアクセスするURLを作る事ができる。
private String makeAccessURL(AccessURL url, String userID, String keyword) throws Exception{ StringBuilder sb = new StringBuilder(); sb.append(url.getPrefix()); if (url.getHasUserID()) { sb.append(userID); } else if (url.getHasKeyword()) { sb.append(keyword); //エンコードする必要あり } else { return sb.toString(); } sb.append(url.getSuffix()); return sb.toString(); }
めんどくさい作業もある
変数の説明はしない
//人力検索 accessUrl[Q_NEW] = new AccessURL("http://q.hatena.ne.jp/list?mode=rss"); accessUrl[Q_KEYWORD] = new AccessURL(false, true, "http://q.hatena.ne.jp/list?mode=rss&word=", ""); accessUrl[Q_CATEGORY] = new AccessURL(false, true, "http://q.hatena.ne.jp/list/", "?mode=rss");
このクラスのおかげで結構楽になったと言っても
API毎に、アクセスするURLを入力しなければいけないのは避けられない。
30個くらいのサービスを対応させる予定なので結構大変。
jiglet作成の過程を説明しようと思ってやってみたけど
やっぱり他の人に説明するのは難しい・・。
意味不明だったらごめんなさい。
あと、まだ作成途中なので間違ってるとこあるかもしれません。