
Retrofit adalah perpustakaan yang dikenal di kalangan pengembang Android untuk jaringan, beberapa bahkan menganggapnya standar dalam beberapa cara. Ada banyak alasan untuk popularitas ini: perpustakaan secara sempurna mendukung REST API, mudah diuji dan dikonfigurasi, dan permintaan melalui jaringan dengan bantuannya dilakukan dengan sangat sederhana. Pada artikel ini, saya akan menunjukkan kepada Anda cara mengkonfigurasi dan menggunakan Retrofit untuk mengimplementasikan jaringan dengan aplikasi Anda.
Konfigurasikan Retrofit
Tambahkan dependensi berikut ke file build.gradle
:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
Kami akan menggunakan Gson untuk mengonversi JSON ke POJO. Retrofit menyediakan dependensi yang secara otomatis mengkonversi JSON ke POJO. Untuk melakukan ini, tambahkan dependensi lain ke file build.gradle
:
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
Jika aplikasi Anda belum diizinkan untuk bekerja dengan jaringan, pastikan untuk menambahkan baris yang sesuai ke file AndroidManifest
:
<uses-permission android:name="android.permission.INTERNET"/>
Setelah dependensi ditambahkan, kita perlu menulis kode untuk mengkonfigurasi perpustakaan Retrofit.
Buat kelas yang disebut NetworkService
:
public class NetworkService { }
Kelas ini harus berupa objek tunggal, jadi deklarasikan variabel statis dan fungsi yang membuat dan mengembalikan variabel dengan tipe yang sama dengan kelas. Jika Anda tidak tahu bagaimana pola ini bekerja, maka periksa artikel ini , yang berisi contoh implementasi dalam bahasa Java.
public class NetworkService { private static NetworkService mInstance; public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } }
Untuk pengujian, kami menggunakan JSONPlaceholder , yang menyediakan API REST online palsu untuk pengembang:
https://jsonplaceholder.typicode.com
Sekarang kita akan mendeklarasikan dan menginisialisasi Retrofit di konstruktor NetworkService
:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } }
Konfigurasi selesai, sekarang kita perlu menentukan titik akhir yang akan mengembalikan data.
Menambahkan Titik Akhir
Buat antarmuka bernama JSONPlaceHolderApi
:
public interface JSONPlaceHolderApi { }
Di situs JSONPlaceHolder, URL /posts/id
adalah titik akhir yang mengembalikan pesan dengan pengidentifikasi yang sesuai. Titik akhir ini menerima permintaan GET dan mengembalikan data dalam format JSON sebagai berikut:
{ "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }
Pertama, kami akan membuat POJO yang sesuai untuk respons JSON:
public class Post { @SerializedName("userId") @Expose private int userId; @SerializedName("id") @Expose private int id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } }
Seperti yang Anda lihat, ini adalah kelas POJO sederhana. Kami menjelaskan variabel menggunakan @SerializedName()
, meneruskan nama di sana. Nama-nama ini sebenarnya adalah kunci dalam data JSON yang dikembalikan dari API, sehingga Anda dapat mengubah nama variabel sesuka Anda, tetapi pastikan bahwa nama yang diteruskan ke penjelasan @SerializedName()
persis ada di JSON.
Di antarmuka yang dibuat di atas, tentukan titik akhir dengan parameter yang diperlukan:
public interface JSONPlaceHolderApi { @GET("/posts/{id}") public Call<Post> getPostWithID(@Path("id") int id); }
Karena kami mengirim permintaan GET, kami perlu menerapkan anotasi @GET
ke metode, yang di dalamnya adalah titik akhir yang ingin kami kirimi permintaan. Seperti yang Anda lihat, kami tidak menambahkan URL lengkap, seperti Retrofit akan secara otomatis mengambil BASE_URL
diteruskan ke kelas NetworkService
dan menambahkannya ke seluruh URL.
Jenis pengembalian metode ini disebut Call<Post>
. Call
adalah kelas yang disediakan langsung oleh perpustakaan itu sendiri. Dan semua metode di antarmuka harus mengembalikan nilai jenis ini. Ini adalah kelas generik yang mengambil jenis objek yang ingin kita konversi ke JSON. Kami melewati Post
karena ini persis objek yang ingin kita konversi menjadi respons JSON. Kami melewati bilangan bulat ke parameter dan menjelaskannya menggunakan @Path
, di dalamnya kami menulis id
. Retrofit akan mengambil nilai ini dan pada titik akhir akan menggantikan {id}
. Jadi, jika kita melewatkan nilai 1 sebagai parameter, maka titik akhir akan terlihat seperti ini /posts/1
, jika kita melewati nilai 10, maka titik akhir akan menjadi /posts/10
.
Sekarang kita perlu Retrofit untuk menyediakan implementasi antarmuka JSONPlaceHolderApi
. Untuk melakukan ini, gunakan metode create()
:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } }
Selanjutnya, Anda perlu mendapatkan JSONPlaceHolderApi
dari NetworkService
dan mengirim permintaan:
NetworkService.getInstance() .getJSONApi() .getPostWithID(1) .enqueue(new Callback<Post>() { @Override public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) { Post post = response.body(); textView.append(post.getId() + "\n"); textView.append(post.getUserId() + "\n"); textView.append(post.getTitle() + "\n"); textView.append(post.getBody() + "\n"); } @Override public void onFailure(@NonNull Call<Post> call, @NonNull Throwable t) { textView.append("Error occurred while getting request!"); t.printStackTrace(); } });
Objek Call
dikembalikan berisi metode yang disebut enqueue
, yang menjadikan Callback<T>
sebagai parameter. Di onResponse
kita mendapatkan hasil Response<Post>
berisi objek Post
dikembalikan dari server. Untuk mendapatkan objek Post
itu sendiri, kami menggunakan metode response.body()
. Sisa kode dapat dimengerti tanpa penjelasan lebih lanjut.
Mengirim berbagai jenis permintaan
API JSONPlaceHolder
memiliki banyak titik akhir berbeda yang dapat Anda gunakan.
Mendapatkan daftar pesan
@GET("/posts") public Call<List<Post>> getAllPosts();
Untuk mendapatkan daftar semua pesan, kami mengubah titik akhir dan mengembalikan jenis fungsi.
Mengirim permintaan dengan parameter
Jika Anda ingin mengirim permintaan dengan parameter, Anda hanya perlu menggunakan penjelasan @Query()
untuk parameter terkait dalam metode:
@GET("/posts") public Call<List<Post>> getPostOfUser(@Query("userId") int id);
Oleh karena itu, jika kita melewatkan nilai 6 dalam parameter metode, maka titik akhir akan menjadi berikutnya - /posts?userId=6
.
Mengirim permintaan POST
Untuk mengirim permintaan POST, Anda hanya perlu mengubah anotasi metode.
@POST("/posts") public Call<Post> postData(@Body Post data);
Untuk membentuk badan permintaan untuk metode ini, kami menggunakan anotasi @Body
untuk parameter yang diteruskan. Retrofit akan menggunakan Gson untuk mengonversi @Body
ke JSON.
Ada beberapa jenis kueri yang berbeda yang bisa Anda gunakan, tetapi ini adalah topik untuk artikel terpisah.
Minta intersepsi
Retrofit menyediakan cara untuk mencegat permintaan dan mencatatnya di Logcat. Mari kita mengatur pencegat dan melihat keajaiban ini. Tambahkan dependensi berikut ke file build.gradle
:
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
Perbarui kelas NetworkService
dengan cara ini:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient.Builder client = new OkHttpClient.Builder() .addInterceptor(interceptor); mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client.build()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } }
Sekarang, ketika Anda mengirim atau menerima permintaan, semua datanya, termasuk URL, tajuk, isi, akan ditampilkan di log:
D/OkHttp: <-- 200 https://jsonplaceholder.typicode.com/posts/1 (3030ms) date: Tue, 24 Apr 2018 15:25:19 GMT content-type: application/json; charset=utf-8 set-cookie: __cfduid=d16d4221ddfba20b5464e6829eed4e3d11524583519; expires=Wed, 24-Apr-19 15:25:19 GMT; path=/; domain=.typicode.com; HttpOnly x-powered-by: Express vary: Origin, Accept-Encoding access-control-allow-credentials: true cache-control: public, max-age=14400 pragma: no-cache expires: Tue, 24 Apr 2018 19:25:19 GMT 04-24 15:25:16.204 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: x-content-type-options: nosniff etag: W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" via: 1.1 vegur cf-cache-status: HIT expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" server: cloudflare cf-ray: 410994f328963066-SIN 04-24 15:25:16.246 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: { 04-24 15:25:16.247 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } <-- END HTTP (292-byte body)
Ini menyimpulkan artikel kami. Anda dapat menemukan kode untuk proyek ini di GitHub .