概要
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();
// ...
}
}
}