del.icio.us APIでタグリスト取得 - httpclientを使ってみる
2007/10/21
2008/01/20
del.icio.us
http
java
del.icio.us/help/api
del.icio.us/help/api/tags
del.icio.usからタグデータを取得するサンプルです。
現時点(2007-10-21)の話です。ですので、今後変更されるかもしれないので注意が必要です。
All del.icio.us APIs are done over https and require HTTP-Auth.
とあります。SSLで、HTTP-Authされていることが条件になります。
最初にブラウザで取得できることをためします。
https://api.del.icio.us/v1/tags/get
でためしてみます。
認証用のダイアログがでて、適切な、ユーザID、パスワードを入れるとxmlデータで結果が返されます。
次にjavaで取得してみます。
HttpComponentsを使ってみました。
HttpComponents - HttpComponents Overview
httpclientとhttpcoreのバージョンの組み合わせは、
httpcomponents-client-4.0-alpha1とhttpcore-4.0-alpha5です。
現時点(2007-10-21)では、httpcore-4.0-alpha6がでているのですが、ためしたらhttpcomponents-client-4.0-alpha1と一緒に使えなかったです。
java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpExecutionContext
がでてしまいました。
なにやらjarを覗いてみてもなかったので、alpha5からalpha6の間に大きな変化があるようです。と、ドキュメントを先に読んどけと怒られそうですが....
コードは、httpcomponents-client-4.0-alpha1のサンプルコードを利用しています。
別のバージョンで動作しない可能性があります
ここでのミソは多分、SSL通信であること、HTTP-Authを使用していることです。
SSLを使っているっていう意識がなくても動いてますね。
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class DeliciousGet {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getState().setCredentials(
new AuthScope("api.del.icio.us", 443),
new UsernamePasswordCredentials("ユーザ", "パスワード"));
HttpGet httpget = new HttpGet("https://api.del.icio.us/v1/tags/get");
System.out.println("executing request" + httpget.getRequestLine());
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
System.out.println("Chunked?: " + entity.isChunked());
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent(), "utf-8"));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
if (entity != null) {
entity.consumeContent();
}
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class DeliciousGet {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getState().setCredentials(
new AuthScope("api.del.icio.us", 443),
new UsernamePasswordCredentials("ユーザ", "パスワード"));
HttpGet httpget = new HttpGet("https://api.del.icio.us/v1/tags/get");
System.out.println("executing request" + httpget.getRequestLine());
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
System.out.println("Chunked?: " + entity.isChunked());
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent(), "utf-8"));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
if (entity != null) {
entity.consumeContent();
}
}
}
: