REST APIでDropBoxを使いこなす

最近あるアプリケーションのアイデアを思いつきまして
JavaでRESTを使ってクラウドストレージを操作する検証をしてました。

今回はDropBox REST APIでDropBoxを操作する方法についてまとめます。

このエントリではRESTクライアントをJavaとJerseyで実装します。
以下に該当する方であれば参考になるかもしれません。

  • DropBoxをSDKではなくRESTで使いたい方
  • JavaでRESTを使いたい方
  • JavaでOAuth 1.0認証を通す方法を知りたい方
  • JavaのRESTクライアントの選定に悩んでいる方

こういうことやりたい人少ないのか、
意外と情報が少ないんですよね。。。


RESTライブラリの選定

Javaの代表的なJAX-RS実装として以下があります。

  • Project Jersey
    JAX-RS のリファレンス実装。
  • Apache CXF
    SOAP, XML/HTTP, RESTful HTTP, CORBAなどの様々なプロトコルを扱えるサービスフレームワーク。
  • Apache Wink
    上記のApache CXFからJAX-RSに関するコアな実装を抽出したフレームワーク。
  • JBoss RESTEasy
    JBossのJAX-RSフレームワーク。
  • Restlet Framework
    軽量RESTフレームワーク。かなり古くから存在。

今回の用途ではRESTクライアントとしてしか使わないので、
JerseyとRestletを両方試して、使いやすかったJerseyを採用することにしました。

ちなみに、各ライブラリの比較には、
(やや古いですが)下記のサイトが参考になります。


Jerseyのインストール

Jerseyのサイトの「Download」からダウンロードします。

どれをダウンロードすべきかわからない場合は、
「A zip file containing all maven-based samples can be obtained here.」
のリンクからまとめてダウンロードするとよいです。

ダウンロードが完了したら、使いたいJARファイルをビルドパスに入れます。
私の場合は下記のJARをビルドパスに加えてます。


準備

まず、DropBoxのサイトより自分が作成するアプリを登録し、
下記の情報を取得してきましょう。

  • Key
  • Secret

情報を取得してきたら、下記のようなクラスを用意します。

public class DropBoxController {
    private static final String CONSUMER_KEY = "【Key】";
    private static final String CONSUMER_SECRET = "【Secret】";
    private static final String REQUEST_TOKEN_URL = "https://api.dropbox.com/1/oauth/request_token";
    private static final String AUTHORIZE_URL = "https://www.dropbox.com/1/oauth/authorize?oauth_token=";
    private static final String ACCESS_TOKEN_URL = "https://api.dropbox.com/1/oauth/access_token";

    private static final String SIGNATURE_METHOD = "HMAC-SHA1";

    // accountに対して取得するKey/Secret
    private static String OAUTH_TOKEN;
    private static String OAUTH_TOKEN_SECRET;

    private static Client client;

    public DropBoxController() {
        // Create a Jersey client
        client = Client.create();
    }
}

準備完了です。


OAuth 1.0 認証

DropBox APIは認証にOAuth 1.0を使用しています。
OAuth 1.0の仕組みについて詳しく知りたい方は下記のサイトを参考にしてください。

流れを簡単に説明すると、下記のようになります。

  1. アプリがDropBoxからRequestTokenを取得
  2. ユーザがRequestTokenをもとにDropBoxに問い合わせ→認証
  3. アプリがDropBoxからAccessTokenを取得

コードにすると下記の感じです。

    public void auth() throws OAuthSignatureException, URISyntaxException {
        getRequestToken();
        authorize();
        getAccessToken();
    }

これから、各メソッドについて説明していきます。

Step 1. アプリがDropBoxからRequestTokenを取得

アプリを登録したときに確認したKeyとSecretをもとに、
DropBoxに問い合わせ、RequestTokenを取得します。

    @GET
    public void getRequestToken() throws OAuthSignatureException, URISyntaxException {
        client.removeAllFilters();

        // Create a resource to be used to make API calls
        WebResource resource = client.resource(REQUEST_TOKEN_URL);

        // Set the OAuth parameters
        OAuthSecrets secrets = new OAuthSecrets().consumerSecret(CONSUMER_SECRET);
        OAuthParameters params = new OAuthParameters()
                .signatureMethod(SIGNATURE_METHOD)
                .consumerKey(CONSUMER_KEY)
                .version("1.0");
        OAuthClientFilter filter = new OAuthClientFilter(client.getProviders(), params, secrets);
        resource.addFilter(filter);
        String response = resource.post(String.class);

        // make the request and print out the result
        OAUTH_TOKEN_SECRET = response.substring(response.indexOf("=") + 1, response.indexOf("&"));
        OAUTH_TOKEN = response.substring(response.indexOf("=", response.indexOf("&")) + 1);
    }

ちなみに、レスポンスは下記のような形式ですので、適当にパースします。

oauth_token_secret=hoge&oauth_token=fuga

Step 2. ユーザがRequestTokenをもとにDropBoxに問い合わせ→認証

Step 1で取得したOAUTH_TOKENで認証用URLを生成します。
ユーザはブラウザ経由で該当URLにジャンプし、許可ボタンを押します。
許可ボタンを押してからアプリのコンソール上でEnterキーを押下すると、
処理を続行するようになっています。

    @GET
    public void authorize() {
        System.out.println("Go to " + AUTHORIZE_URL + OAUTH_TOKEN + " in a browser window.");

        // wait for authorize in browser
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.print("Push Enter key after authorization : ");
            br.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

ちなみに、ブラウザからアクセスするとこんな画面が表示されます。

Step 3. アプリがDropBoxからAccessTokenを取得

認証されたOAUTH_TOKENをもとに、AccessTokenを取得します。

    @GET
    public void getAccessToken() {
        client.removeAllFilters();

        // Set the OAuth parameters
        OAuthSecrets secrets = new OAuthSecrets()
                .consumerSecret(CONSUMER_SECRET)
                .tokenSecret(OAUTH_TOKEN_SECRET);
        OAuthParameters params = new OAuthParameters()
                .signatureMethod(SIGNATURE_METHOD)
                .consumerKey(CONSUMER_KEY)
                .version("1.0").token(OAUTH_TOKEN);

        // Create the OAuth client filter
        OAuthClientFilter filter = new OAuthClientFilter(client.getProviders(), params, secrets);

        // Create a resource to be used to make API calls
        WebResource resource = client.resource(ACCESS_TOKEN_URL);

        // Add the filter to the resource
        resource.addFilter(filter);

        // make the request and print out the result
        String response = resource.post(String.class);
        OAUTH_TOKEN_SECRET = response.substring(response.indexOf("=") + 1, response.indexOf("&"));
        OAUTH_TOKEN = response.substring(response.indexOf("=", response.indexOf("&")) + 1, response.lastIndexOf("&"));
    }

ちなみに、レスポンスは下記のような形式ですので、適当にパースします。

oauth_token_secret=hoge&oauth_token=fuga&uid=piyo

ファイル一覧の取得

試しにPublicディレクトリ配下のファイルのメタ情報を取得してみましょう。

    @GET
    public void getFiles() {
        client.removeAllFilters();

        // Set the OAuth parameters
        OAuthSecrets secrets = new OAuthSecrets()
                .consumerSecret(CONSUMER_SECRET)
                .tokenSecret(OAUTH_TOKEN_SECRET);
        OAuthParameters params = new OAuthParameters()
                .signatureMethod("HMAC-SHA1")
                .consumerKey(CONSUMER_KEY)
                .version("1.0").token(OAUTH_TOKEN);

        // Create the OAuth client filter
        OAuthClientFilter filter = new OAuthClientFilter(client.getProviders(), params, secrets);

        // Create a resource to be used to make API calls
        WebResource resource = client.resource(FILE_URL + "?root=dropbox&path=Public");

        // Add the filter to the resource
        resource.addFilter(filter);

        // make the request and print out the result
        String response = resource.get(String.class);
        System.out.println("response : " + response);
    }

ファイルのメタ情報の一覧が取得できるはずです。

AccessTokenさえ取得できればあとはなんでもできるので、
DropBox REST APIを参考に、いろいろいじってみましょう。


参考

広告
  1. トラックバックはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。