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を使うと同期処理になる(エラーが特定バージョン以降でちゃうけど)。