沢山の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作成の過程を説明しようと思ってやってみたけど
やっぱり他の人に説明するのは難しい・・。
意味不明だったらごめんなさい。
あと、まだ作成途中なので間違ってるとこあるかもしれません。