Posted at

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

More than 3 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 {

// 省略
}