Retrofitも使ってみる。なんか一番人気がありそう。REST APIに対して使いやすい感じっぽい。
設定
build.gradleに下記を設定する。
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'
使い方
参考: Android:Retrofit2.0ではてなAPIとおしゃべりしてみた Retrofit2 &OkHttpでAndroidのHTTP通信が快適だにゃん
なんか思ってたのと違う。近代的だ。すっきりするからいい感じな気がする。でも色々ブラックボックス化してるから、エラーのときとかイライラする可能性はあるかもなあと思った。
コードサンプル
APIにアクセスすると、itemの配列がjsonデータでもらえるようになっている。itemは、id、name、price、descriptionというフィールドがある。 URLを、https://hoge.com/items/index.jsonとすると、返ってくるのは、[{id:1, name:たまご...}, {}]みたいなJSONデータ。
まずは、モデルクラスをつくる
モデルクラス
item.java
package com.logicky.json.data; public class Item { public String name; public Integer price; public String description; }
Interface
次に、APIのURL毎に対応する関数が羅列されているインターフェースをつくる
MyApiInterface.java
package com.logicky.json; import com.logicky.json.data.Item; import java.util.List; import retrofit2.Call; import retrofit2.http.GET; public interface MyApiInterface { String END_POINT = "https://hoge.com"; @GET("items/index.json") Call<List<Item>> getItems(); }
Activity
package com.logicky.json; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import com.logicky.json.data.Item; import java.util.List; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class MainActivity extends AppCompatActivity { private MyApiInterface myapi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Retrofit retrofit = new Retrofit.Builder() .baseUrl(MyApiInterface.END_POINT) .addConverterFactory(GsonConverterFactory.create()) .build(); myapi = retrofit.create(MyApiInterface.class); getItems(); } private void getItems() { Log.d("TEST", "getItems"); Call<List<Item>> call = myapi.getItems(); call.enqueue(new Callback<List<Item>>() { @Override public void onResponse(Call<List<Item>> call, Response<List<Item>> response) { Log.d("TEST", "getItems Response"); List<Item> items = response.body(); Log.d("TEST", items.get(0).name); } @Override public void onFailure(Call<List<Item>> call, Throwable t) { Log.d("TEST", "getItems Failure"); Log.d("TEST", t.getMessage()); } }); } }