LoginSignup
4
3

More than 5 years have passed since last update.

Retrofit + Gsonを試してみました

Last updated at Posted at 2016-12-18

概要

Android:Retrofit2.0ではてなAPIとおしゃべりしてみた - techiumを参考にしてRetrofit + Gsonを試してみました。

ソースは、githubにあります。

この記事はとても分かりやすかったのですが、gson変換とXML変換の二つが実装されていたのをgson変換のみにすることによって、よりretrofit + gsonの実装がわかりやすいようにしました(つもりです)。

上記の記事では、はてなブックマークエントリー情報取得APIを使って、ブックマーク一覧を取得しています。
はてなブックマークエントリー情報取得APIは、以下のURLのリクエストを送信するとjson形式で結果を返してくれるAPIです。

URL
http://b.hatena.ne.jp/entry/json/?url=http%3A%2F%2Fb.hatena.ne.jp%2Fctop%2Fit

結果(一部)
{
    "related": [
        {
            "count": 1502,
            "url": "http://scrambleworks.net/windows-freesoft-recommend",
            "eid": 234774846,
            "title": "Windowsを16年使ってきて分かったおすすめ無料ソフトまとめ | Scramble Works",
            "entry_url": "http://b.hatena.ne.jp/entry/scrambleworks.net/windows-freesoft-recommend"
        },
        ...
    ],
    "count": 27,
    "bookmarks": [
        {
            "comment":"",
            "timestamp":"2016/01/04 17:38:03",
            "user":"kamiokando",
            "tags":[]
        },
        ...
    ]
}

retrofitとは

retrofitは、HTTP通信レスポンスを、javaインスタンスにデータ変換するライブラリです。
HTTP通信はOkHttpを使っています。
データ変換は、複数の変換ライブラリから選択できます。

  • gson(json:google)
  • jackson(json:fasterxml)
  • moshi(json:squareup)
  • scalars(?)
  • simplexml(xml:squareup)
  • wire(?)

実装手順

retrofitを使ったAndroidアプリは以下の手順で実装できます。

環境

  • Mac OS X Sierra 10.12.2
  • Android Studio 2.2.3
  • 実機:Nexus 5

ライブラリを追加(build.gradle(Module:app))

それぞれのライブラリは、2016/12時点の最新バージョンです。

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.8.0'

AndroidManifest.xml修正

インターネットアクセス用のパーミッションを追加する。

<uses-permission android:name="android.permission.INTERNET"/>

データクラス(Bookmark/BookmarkEntry)を作成する

jsonデータを参照して、javaインスタンス化したいクラスを作成します。

  • BookmarkEntry
name(json) 型(java) プロパティ名
related 無視
count Integer count
title String title
bookmarks List<Bookmark> bookmarks
  • Bookmark
name(json) 型(java) プロパティ名
comment String comment comment
timestamp String timestamp
user String user

APIインタフェースを作成する

GETの後ろに書くパスはベースURLからの相対パスです。

@Query("url")が?url=に変換されます。

HatenaApiInterface.java

    String END_POINT = "http://b.hatena.ne.jp";
    String TARGET_URL = "http://b.hatena.ne.jp/ctop/it";

    @GET("/entry/jsonlite/")
    Call<BookmarkEntry> getBookmarkEntry(@Query("url") String target);

retrofit処理を追加

MainActivity.java

    protected void onCreate(Bundle savedInstanceState) {

        // 結果表示用ListView
        mListView = (ListView) findViewById(R.id.listView);

        Retrofit retrofit = new Retrofit.Builder()
                // BASE URL
                .baseUrl(HatenaApiInterface.END_POINT)
                // gsonコンバーター
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        // インタフェース作成
        mApiInterface = retrofit.create(HatenaApiInterface.class);
        getBookmarkEntry(HatenaApiInterface.TARGET_URL);
    }

    private void getBookmarkEntry(String targetUrl) {
        // ...
        // Hatena API呼び出し
        Call<BookmarkEntry> call = mApiInterface.getBookmarksWithUrl(targetUrl);
        call.enqueue(new Callback<BookmarkEntry>() {
            // onResponseとonFailureをオーバーライド
            public void onResponse(Call<BookmarkEntry> call, Response<BookmarkContainer> response) {
                // HTTPレスポンスをJavaクラスで取得
                BookmarkEntry entry = response.body();
                // ...
            }
        

    }

retrofit参考資料

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3