Help us understand the problem. What is going on with this article?

RetroFitでAndroidのREST通信&JSON変換を幸せにする

More than 5 years have passed since last update.

RetroFitって何?

AndroidのREST通信を簡潔にし、POJO変換もしてくれるライブラリ。

AsyncLoaderだのjsonObjectだのに振り回されなくて済むので非常にありがたいです。

Retrofitの導入

http://square.github.io/retrofit/

  • gradleに以下追記

※最新バージョンは公式参照の事

app/build.gradle
dependencies {
    // 以下追記
    compile 'com.squareup.retrofit:retrofit:1.6.1'
}

レスポンス用のオブジェクトを生成

  • jsonschema2pojoを利用してjsonから生成

http://www.jsonschema2pojo.org/

※基本的には、Source typeはJSON、Annotation styleはNoneでOK

注意!!

レスポンスパラメータがスネークケースだと自動変換してくれないので、
サーバ側で返すパラメータはキャメルにしておきましょう。

各部実装

ちょっと長いですが、今回はObserverパターンを利用して汎用的に使えるコールバックも併せて定義しています。
一度作っておくとあとで非常に楽になります。

  • まずはマニフェスト
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.hoge.hogehoge" >

    <!-- インターネット接続用のパーミッションと、ネットワーク状況取得用の
パーミッションを追加する。 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <!-- 省略 -->
</manifest>
  • 今回はActivityに書いてますが、もちろんFragmentでも構いません。
MainActivity.java
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // デフォルトのアダプター(converter)はjson用
        // json以外の形式をサポートするには別途converterの実装が必要
        RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint("http://www.test.jp")
        .build();
        RetroFitApi service = restAdapter.create(RetroFitApi.class);

        service.getNew("hoge", new RequestCallback<ArticleList>(new ArticleListener()));
    }

    // コールバックリスナーの定義
    public class ArticleListener implements RequestListener<ArticleList> {
        @Override
        public void onSuccess(ArticleList response) {
            Log.d("rest", "onSuccess!!!");
        }
        @Override
        public void onFailure(RetrofitError error) {
            Log.d("rest", "onFailure!!!");
        }
    }
}
  • RetroFit用のinterface
RetroFitApi.java
/**
 * 各APIのテンプレートをこのinterfaceに集約させる
 */
public interface RetroFitApi {

    /**
     * アノテーションでGET/POST/PUT/DELETEを指定。
     * カッコ内はリクエストのホスト部以降を指定。
     * 
     * 戻り型をvoidとすることで勝手に別スレッドで通信処理を行ってくれる。
     * 
     * メソッドの引数とアノテーションの組み合わせで
     * リクエストパラメータを生成する。
     * 下記の例では?name="hoge"が付与される
     * 
     * コールバックにPOJOのオブジェクトを指定するとPOJO変換してくれる。
     */
    @GET("/news/new")
    void getNew(@Query("name") String name, Callback<ArticleList> cb);
}
  • ObserverパターンのSubject部
RequestCallback.java
/**
 * REST通信のコールバック
 */
public class RequestCallback<T> implements Callback<T> {

    private RequestListener<T> mListener;

    public RequestCallback(RequestListener<T> listener){
        mListener = listener;
    }

    // 正常終了時に呼ばれる
    @Override
    public void success(T object, Response response){
        mListener.onSuccess(object);
    }

    // 異常終了時に呼ばれる
    @Override
    public void failure(RetrofitError error){
        mListener.onFailure(error);
    }
}
  • ObserverパターンのObserver部
RequestListener.java
/**
 * REST通信のコールバックに利用するinterface
 */
public abstract interface RequestListener<T> {
    void onSuccess(T response);
    void onFailure(RetrofitError error);
}
  • jsonscheme2pojoで自動生成したPOJOファイル。
Article.java
public class Article {
    // 省略
}
ArticleList.java
public class ArticleList {
    // 省略
}
HamaTech
Webアプリ・Androidアプリ・基幹業務のエンジニアをやってます。 フロント/サーバーなんでもござれ。Androidアプリではランキング1位も獲得 https://play.google.com/store/apps/developer?id=HamaTech
http://hamatech.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away