Bir önceki yazımızda web servis ile iletişim kurmak adına Android üzerinde “Volley” kütüphanesi ile “post” işlemine bakmıştık. Dilerseniz buradan okuyabilirsiniz. Bugün de benzer işlemi yapan açık kaynaklı olarak geliştirilen “Retrofit” kütüphanesine bakacağız.
İlk olarak “app->Gradle” içerisinde “dependencies” altına kütüphaneyi ekleyelim. Bunun yanında “Json” parçalamak için “Gson” kütüphanesini de ekleyelim.
1 2 3 |
compile 'com.google.code.gson:gson:2.6.2' compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:converter-gson:2.2.0' |
Daha sonra “AndroidManifest.xml” içerisine Internet iznini ekleyelim.
1 |
<uses-permission android:name="android.permission.INTERNET"/> |
Şimdi bir tane “Item” sınıfı yazalım. Bunun içerisinde gelecek olan değerlere ait değişkenler tanımlayalım. Bunu yaparken “annotation” kullanarak gelecek olan “Json” içerisinde ki değerlere karşılık verme amacıyla “@SerializedName(“”)” kullanalım. Bunun için öncelikle gelecek olan “Json” yapısını göz önüne almamız gerekiyor. Bizim burada örneğimizde ki yapı,
1 2 3 4 5 6 7 8 9 10 11 12 |
[ { "id":1, "rank":1, "name":"The Shawshank Redemption", "year":1994, "rating":9.2 } , . . ] |
“Constructor” ve “getter” metotlarını da yazdıktan sonra sınıfımız alttaki şekilde oluyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package com.KemalBakacak.RetrofitExample; import com.google.gson.annotations.SerializedName; public class MovieItem { @SerializedName("id") private int id; @SerializedName("rank") private int rank; @SerializedName("name") private String name; @SerializedName("year") private String year; @SerializedName("rating") private float rating; public MovieItem(int id, int rank, String name, String year, float rating) { this.id = id; this.rank = rank; this.name = name; this.year = year; this.rating = rating; } public int getId() { return id; } public int getRank() { return rank; } public String getName() { return name; } public String getYear() { return year; } public float getRating() { return rating; } } |
Şimdi genel olarak uygulama içerisinde kullanacağımız “Retrofit Builder” yapısı için bir sınıf yazalım. İçerisinde “static” olarak değişkenler kullanacağız. Ayrıca burada bir tane Url için “BASE_URL” vereceğiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.KemalBakacak.RetrofitExample; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class ApiClient { public static final String BASE_URL = "http://www.kemalbakacak.com/blog-test-api/"; private static Retrofit retrofit = null; public static Retrofit getClient() { if (retrofit==null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } |
Bir tane de “interface” yazacağız. Bunun içerisinde uygulama içerisinde kullanacağımız tüm web servisi ile olan işlemlerin metotlarını ekleyeceğiz. İlk olarak parametre eklemeden bütün verileri alacağız. “@POST” içerisinde yukarı da yazdığımız “BASE_URL” e ekleyecek. Buraya yazacağımız metotlar “Call” sınıfında dönüş değerleri olacak ve içerisine yukarı da yazdığımız “Item” yapılarını vereceğiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.KemalBakacak.RetrofitExample; import java.util.List; import retrofit2.Call; import retrofit2.http.POST; public interface ApiInterface { @POST("all-data.php") Call<List<MovieItem>> getMovie(); } |
Buradan sonra “MainActivity” içerisinde devam edelim. Global olarak
1 |
ApiInterface apiService = null; |
Tanımlayalım. Ardından,
1 |
apiService = ApiClient.getClient().create(ApiInterface.class); |
Buradan sonra artık işlem yapabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private void getAllData() { Call<List<MovieItem>> call = apiService.getMovie(); call.enqueue(new Callback<List<MovieItem>>() { @Override public void onResponse(Call<List<MovieItem>> call, Response<List<MovieItem>> response) { Log.d(TAG, "onResponse"); writeDataOnLog(response.body()); } @Override public void onFailure(Call<List<MovieItem>> call, Throwable t) { Log.d(TAG, "onFailure"); } }); } |
Log için yazan metodu da ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private void writeDataOnLog(List<MovieItem> movieItems) { MovieItem movieItem = null; for(int i = 0; i < movieItems.size(); i++) { movieItem = movieItems.get(i); Log.d(TAG, "Rank : " + movieItem.getRank()); Log.d(TAG, "Name : " + movieItem.getName()); Log.d(TAG, "Year : " + movieItem.getYear()); Log.d(TAG, "Rating : " + movieItem.getRating()); Log.d(TAG, "---------"); } } |
Şimdi bir “id” değeri ile birlikte veri çekelim. Bunun için öncelikle “ApiInterface” içerisine metotu ekleyelim.
1 2 3 |
@FormUrlEncoded @POST("selected-data.php") Call<List<MovieItem>> getSelectedMovie(@Field("id") int id); |
Yollarken kullanacağımız değişken ismini “@Field” içerisinde veriyoruz. Değişken yollayabilmek içinde “@FormUrlEncoded” kullanmamız gerekmekte.
“MainActivity” içerisinde de yeni bir metot yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private void getSelectedData(int id) { Call<List<MovieItem>> call = apiService.getSelectedMovie(id); call.enqueue(new Callback<List<MovieItem>>() { @Override public void onResponse(Call<List<MovieItem>> call, Response<List<MovieItem>> response) { Log.d(TAG, "onResponse"); writeDataOnLog(response.body()); } @Override public void onFailure(Call<List<MovieItem>> call, Throwable t) { Log.d(TAG, "onFailure"); } }); } |
“MainActivity” sınıfının tam kodunu ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
package com.KemalBakacak.RetrofitExample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; 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 String TAG = MainActivity.class.getSimpleName(); ApiInterface apiService = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); apiService = ApiClient.getClient().create(ApiInterface.class); //getAllData(); getSelectedData(2); } private void getAllData() { Call<List<MovieItem>> call = apiService.getMovie(); call.enqueue(new Callback<List<MovieItem>>() { @Override public void onResponse(Call<List<MovieItem>> call, Response<List<MovieItem>> response) { Log.d(TAG, "onResponse"); writeDataOnLog(response.body()); } @Override public void onFailure(Call<List<MovieItem>> call, Throwable t) { Log.d(TAG, "onFailure"); } }); } private void getSelectedData(int id) { Call<List<MovieItem>> call = apiService.getSelectedMovie(id); call.enqueue(new Callback<List<MovieItem>>() { @Override public void onResponse(Call<List<MovieItem>> call, Response<List<MovieItem>> response) { Log.d(TAG, "onResponse"); writeDataOnLog(response.body()); } @Override public void onFailure(Call<List<MovieItem>> call, Throwable t) { Log.d(TAG, "onFailure"); } }); } private void writeDataOnLog(List<MovieItem> movieItems) { MovieItem movieItem = null; for(int i = 0; i < movieItems.size(); i++) { movieItem = movieItems.get(i); Log.d(TAG, "Rank : " + movieItem.getRank()); Log.d(TAG, "Name : " + movieItem.getName()); Log.d(TAG, "Year : " + movieItem.getYear()); Log.d(TAG, "Rating : " + movieItem.getRating()); Log.d(TAG, "---------"); } } } |
“ApiInterface” sınıfının kodları,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.KemalBakacak.RetrofitExample; import java.util.List; import retrofit2.Call; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface ApiInterface { @POST("all-data.php") Call<List<MovieItem>> getMovie(); @FormUrlEncoded @POST("selected-data.php") Call<List<MovieItem>> getSelectedMovie(@Field("id") int id); } |
Teşekkürler, görüşmek üzere.