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

## 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 {
    // 省略
}
```