Android
Retrofit2

Retrofit を使ってAPIを呼びだす

AndroidのライブラリであるHTTPクライアント「Retrofit」を使ってWeb APIを呼び出す。

呼び出すもの

Zaif APIでビットコインのティッカー情報
http://techbureau-api-document.readthedocs.io/ja/latest/public/2_individual/4_ticker.html

準備

build.gradle
dependencies {
  ....
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
}

GSONはJSONデータをJavaオブジェクトに変換するものでGoogleが開発した(だからGSON?)

インターフェイス

API_Interface.java
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;

public interface API_Interface {

    @GET("/api/1/ticker/{currency_pair}")
    Call<Data> API(@Path("currency_pair") String currency_pair);
}

アノテーションで使えるものはGET、POST、PUT、DELETE、HEADの5つ。
@GET()内はベースURLの後のURLを指定、{}と@Path()内は同じ文字列にすること。そして型を後置の文で指定している。

Dataクラス

Data.java
public class Data {
    public float last;
    public float high;
    public float low;
    public float volume;
    public float bid;
    public float ask;

    public Data(float last, float high, float low, float volume, float bid, float ask) {
        super();
        this.last = last;
        this.high = high;
        this.low = low;
        this.volume = volume;
        this.bid = bid;
        this.ask = ask;
    }

    public float getLast() {
        return last;
    }

    public float getHigh() {
        return high;
    }

    public float getLow() {
        return low;
    }

    public float getVolume() {
        return volume;
    }

    public float getBid() {
        return bid;
    }

    public float getAsk() {
        return ask;
    }
}

変数名を戻り値と一緒にすることでデータを突っ込んでくれる。

アクティビティ

MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView text_last=(TextView)findViewById(R.id.text_last);
        final TextView text_high=(TextView)findViewById(R.id.text_high);
        final TextView text_low=(TextView)findViewById(R.id.text_low);
        final TextView text_volume=(TextView)findViewById(R.id.text_volume);
        final TextView text_bid=(TextView)findViewById(R.id.text_bid);
        final TextView text_ask=(TextView)findViewById(R.id.text_ask);

        Retrofit retro = new Retrofit.Builder()
                .baseUrl("https://api.zaif.jp")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        API_Interface service = retro.create(API_Interface.class);

        Call<Data> btc = service.API("btc_jpy");

        btc.enqueue(new Callback<Data>() {
            @Override
            public void onResponse(Call<Data> call, Response<Data> response) {
                Data ticker = response.body();
                text_last.setText("Last:"+Float.toString(ticker.getLast())+"円");
                text_high.setText("High:"+Float.toString(ticker.getHigh())+"円");
                text_low.setText("Low:"+Float.toString(ticker.getLow())+"円");
                text_volume.setText("Volume:"+Float.toString(ticker.getVolume())+"BTC");
                text_bid.setText("Bid:"+Float.toString(ticker.getBid())+"円");
                text_ask.setText("Ask:"+Float.toString(ticker.getAsk())+"円");

            }

            @Override
            public void onFailure(Call<Data> call, Throwable t) {
            }
        });
Call<Data> btc = service.API("btc_jpy");

の()内でcurrency_pairを指定することができる。
あと、enqueueを使うと非同期処理になり、executeを使うと同期処理になる(エラーが特定バージョン以降でちゃうけど)。

実行結果

Screenshot_1512984764.png