プログラマメモ2 - programmer no memo2

del.icio.us APIでタグリスト取得 - httpclientを使ってみる 2007/10/21
2008/01/20

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();
}
}
}

: