Mengirim Data Dengan Client HTTP Retrofit 2 untuk Android
Indonesian (Bahasa Indonesia) translation by Muhlis Tirowali (you can also view the original English article)



Apa itu Retrofit?
Retrofit adalah client HTTP type-safe untuk Android dan Java. Retrofit memudahkan untuk terhubung ke layanan web REST dengan menerjemahkan API ke dalam antarmuka Java. Dalam tutorial ini, saya akan menunjukkan cara menggunakan salah satu perpustakaan HTTP yang paling populer dan sering direkomendasikan untuk Android.
Perpustakaan yang kuat ini mempermudah penggunaan data JSON atau XML, yang kemudian diurai menjadi Plain Old Java Objects (POJOs). Permintaan GET, POST, PUT, PATCH, dan DELETE semua bisa dieksekusi.
Seperti kebanyakan perangkat lunak open-source, Retrofit dibangun di atas beberapa perpustakaan dan alat bantu lainnya. Di balik layar, Retrofit memanfaatkannya OkHttp (dari pengembang yang sama) untuk menangani permintaan jaringan. Selain itu, Retrofit tidak memiliki konverter JSON built-in untuk mengurai dari objek JSON ke Java. Sebagai gantinya, ini mendukung perpustakaan konverter JSON untuk menangani hal itu:
- Gson:
com.squareup.retrofit:converter-gson - Jackson:
com.squareup.retrofit:converter-jackson - Moshi:
com.squareup.retrofit:converter-moshi
Untuk Protocol buffers, Retrofit mendukung:
- Protobuf:
com.squareup.retrofit2:converter-protobuf - Wire:
com.squareup.retrofit2:converter-wire
dan untuk XML Retrofit, mendukunh:
- Simple Framework:
com.squareup.retrofit2:converter-simpleframework
Jadi Mengapa Menggunakan Retrofit?
Mengembangkan perpustakaan HTTP type-safe anda sendiri untuk berinteraksi dengan API REST bisa menjadi kesulitan yang nyata: anda harus menangani banyak aspek, seperti membuat koneksi, caching, mencoba kembali permintaan yang gagal, threading, parsing respons, penanganan kesalahan, dan banyak lagi. Retrofit, di sisi lain, adalah perpustakaan yang terencana, terdokumentasi dan teruji yang akan menghemat banyak waktu dan tenaga.
Dalam tutorial ini, saya akan menjelaskan cara menggunakan Retrofit 2 untuk menangani permintaan jaringan dengan Retrofit 2 untuk menangani permintaan jaringan dengan membangun aplikasi sederhana yang akan menjalankan permintaan POST, permintaan PUT (untuk memperbarui entitas), dan permintaan DELETE. Saya juga akan menunjukkan cara mengintegrasikannya dengan RxJava dan cara membatalkan permintaan. Kami akan menggunakan API yang disediakan oleh JSONPlaceholder - ini adalah API REST online palsu untuk pengujian dan pembuatan prototipe.
Lihat posting saya sebelumnya, Memulai Dengan Client HTTP Retrofit 2, untuk belajar bagaimana caranya menjalankan permintaan GET dan cara mengintegrasikan Retrofit dengan RxJava.
1. Buat Proyek Android Studio
Jalankan Android Studio dan buat proyek baru dengan aktivitas kosong yang disebut MainActivity.
2. Membuat Dependensi (Dependencies)
Setelah membuat proyek baru, nyatakan dependensi berikut di build.gradle anda. Dependensinya meliputi perpustakaan Retrofit dan juga perpustakaan Google Gson untuk mengubah JSON menjadi POJO (Plain Old Java Objects) serta integrasi Gson Retrofit.
1 |
// Retrofit
|
2 |
compile 'com.squareup.retrofit2:retrofit:2.1.0' |
3 |
|
4 |
// JSON Parsing
|
5 |
compile 'com.google.code.gson:gson:2.6.1' |
6 |
compile 'com.squareup.retrofit2:converter-gson:2.1.0' |
Pastikan Anda menyelaraskan proyek Anda setelah menambahkan dependensi.
3. Menambahkan Izin Internet
Untuk melakukan operasi jaringan, kita perlu memasukkan izin INTERNET dalam manifest aplikasi: AndroidManifest.xml.
1 |
<?xml version="1.0" encoding="utf-8"?>
|
2 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
3 |
package="com.chikeandroid.retrofittutorial2"> |
4 |
|
5 |
<uses-permission android:name="android.permission.INTERNET" /> |
6 |
|
7 |
<application
|
8 |
android:allowBackup="true" |
9 |
android:icon="@mipmap/ic_launcher" |
10 |
android:label="@string/app_name" |
11 |
android:supportsRtl="true" |
12 |
android:theme="@style/AppTheme"> |
13 |
<activity android:name=".PostActivity"> |
14 |
<intent-filter>
|
15 |
<action android:name="android.intent.action.MAIN"/> |
16 |
|
17 |
<category android:name="android.intent.category.LAUNCHER"/> |
18 |
</intent-filter>
|
19 |
</activity>
|
20 |
</application>
|
21 |
|
22 |
</manifest>
|
4. Menjalankan Model Secara Otomatis
Kita akan membuat model secara otomatis dari data respon JSON dengan memanfaatkan: jsonschema2pojo. Kita ingin membuat sebuah permintaan POST (membuat sumber baru) pada API. Tapi sebelum kita menjalankan permintaan ini, kita perlu mengetahui respon JSON yang kita harapkan saat dijalankan dengan sukses sehingga Retrofit dapat mengurai respons JSON dan mendesainnya ke objek Java. Menurut API, jika kita mengirim data berikut dalam sebuah permintaan POST:
1 |
data: {
|
2 |
title: 'foo', |
3 |
body: 'bar', |
4 |
userId: 1 |
5 |
} |
Kita harus mendapatkan respon berikut:
1 |
{
|
2 |
"title": "foo", |
3 |
"body": "bar", |
4 |
"userId": 1, |
5 |
"id": 101 |
6 |
} |
Peta Data JSON ke Java
Salin data respom sampel dari bagian sebelumnya. Sekarang kunjungi jsonschema2pojo dan paste respon JSON ke dalam kotak input. Pilih jenis sumber JSON, gaya anotasi Gson, hapus centang Allow additional properties, dan ganti nama kelasnya Example menjadi Post.



Kemudian klik tombol Preview untuk menjalankan obyek Java.



Anda mungkin bertanya-tanya apa itu @SerializedName dan @Expose penjelasan dalam kode yang dihasilkan ini! Jangan khawatir, saya akan jelaskan semuanya!
Anotasi @SerializedName dibutuhkan untuk Gson memetakan tombol JSON ke objek Java.
1 |
@SerializedName("userId")
|
2 |
@Expose |
3 |
private Integer userId; |
Dalam kasus ini, identitas pengguna tombol JSON dipetakan ke bidang kelas userID. Tapi perhatikan bahwa karena mereka sama, tidak perlu menyertakan anotasi @SerializedName di bidang karena Gson akan memetakannya secara otomatis untuk kita.
Anotasi @Expose menunjukkan bahwa anggota kelas harus terbuka untuk serialisasi atau deserialisasi JSON.
Impor Model Data ke Android Studio
Sekarang mari kita kembali ke Android Studio. Buat sub-paket baru di dalam paket utama dan beri nama data. Di dalam paket yang baru dibuat, buat paket lain dan beri nama model. Di dalam paket ini, buat kelas Java baru dan beri nama Pos. Sekarang salin kelas Pos yang dihasilkan oleh jsonschema2pojo dan paste ke dalam kelas Post yang Anda buat.
1 |
package com.chikeandroid.retrofittutorial2.data.model; |
2 |
|
3 |
import com.google.gson.annotations.Expose; |
4 |
import com.google.gson.annotations.SerializedName; |
5 |
|
6 |
public class Post { |
7 |
|
8 |
@SerializedName("title") |
9 |
@Expose
|
10 |
private String title; |
11 |
@SerializedName("body") |
12 |
@Expose
|
13 |
private String body; |
14 |
@SerializedName("userId") |
15 |
@Expose
|
16 |
private Integer userId; |
17 |
@SerializedName("id") |
18 |
@Expose
|
19 |
private Integer id; |
20 |
|
21 |
public String getTitle() { |
22 |
return title; |
23 |
}
|
24 |
|
25 |
public void setTitle(String title) { |
26 |
this.title = title; |
27 |
}
|
28 |
|
29 |
public String getBody() { |
30 |
return body; |
31 |
}
|
32 |
|
33 |
public void setBody(String body) { |
34 |
this.body = body; |
35 |
}
|
36 |
|
37 |
public Integer getUserId() { |
38 |
return userId; |
39 |
}
|
40 |
|
41 |
public void setUserId(Integer userId) { |
42 |
this.userId = userId; |
43 |
}
|
44 |
|
45 |
public Integer getId() { |
46 |
return id; |
47 |
}
|
48 |
|
49 |
public void setId(Integer id) { |
50 |
this.id = id; |
51 |
}
|
52 |
|
53 |
@Override
|
54 |
public String toString() { |
55 |
return "Post{" + |
56 |
"title='" + title + '\'' + |
57 |
", body='" + body + '\'' + |
58 |
", userId=" + userId + |
59 |
", id=" + id + |
60 |
'}'; |
61 |
}
|
62 |
}
|
Selain getter dan setter, saya juga menambahkan metode toString(). (Di Intellij, anda bisa menggunakan perintah Generate untuk mempermudah ini: Alt-Insert pada Windows, atau Command-N di macOS).
5. Membuat Instansi Retrofit
Untuk mengeluarkan permintaan jaringan ke API dengan Retrofit, kita perlu membuat contoh menggunakan kelas Builder Retrofit dan mengkonfigurasinya dengan URL dasar.
Buat sub-paket baru di dalam data paket dan nama itu remote. Nah, di dalam paket ini, buat kelas Java dan beri nama RetrofitClient. Kelas ini akan menciptakan satu kesatuan Retrofit dalam metode getClient (String baseUrl) dan mengembalikannya ke pemanggil.
Seperti yang saya sebutkan sebelumnya, Retrofit membutuhkan URL dasar untuk membangun instancenya, jadi kami akan menyebarkannya sebuah URL saat memanggil RetrofitClient.getClient (String baseUrl). URL ini kemudian akan digunakan untuk membangun instance di baris 13. Kita juga menentukan konverter JSON yang kita butuhkan (Gson) di baris 14.
1 |
package com.chikeandroid.retrofittutorial2.data.remote; |
2 |
import retrofit2.Retrofit; |
3 |
import retrofit2.converter.gson.GsonConverterFactory; |
4 |
|
5 |
public class RetrofitClient { |
6 |
|
7 |
private static Retrofit retrofit = null; |
8 |
|
9 |
public static Retrofit getClient(String baseUrl) { |
10 |
if (retrofit==null) { |
11 |
retrofit = new Retrofit.Builder() |
12 |
.baseUrl(baseUrl) |
13 |
.addConverterFactory(GsonConverterFactory.create()) |
14 |
.build(); |
15 |
}
|
16 |
return retrofit; |
17 |
}
|
18 |
}
|
6. Membuat Antarmuka API
Di dalam paket remote, buatlah sebuah antarmuka dan sebut saja APIService. Antarmuka ini berisi metode yang akan kita gunakan untuk menjalankan permintaan HTTP seperti POST, PUT, dan DELETE. Mari kita mulai dengan POST request.
1 |
package com.chikeandroid.retrofittutorial2.data.remote; |
2 |
import com.chikeandroid.retrofittutorial2.data.model.Post; |
3 |
import retrofit2.Call; |
4 |
import retrofit2.http.Field; |
5 |
import retrofit2.http.FormUrlEncoded; |
6 |
import retrofit2.http.POST; |
7 |
|
8 |
public interface APIService { |
9 |
|
10 |
@POST("/posts") |
11 |
@FormUrlEncoded
|
12 |
Call<Post> savePost(@Field("title") String title, |
13 |
@Field("body") String body, |
14 |
@Field("userId") long userId); |
15 |
}
|
Melihat ke kelas APIService, kita punya metode yang disebut savePost(). Di atas metode tersebut adalah @POST annotation, yang menunjukkan bahwa kita ingin menjalankan permintaan POST saat metode ini dipanggil. Nilai argumen untuk anotasi @POST adalah titik akhir-yaitu /posts. Jadi URL lengkapnya adalah http://jsonplaceholder.typicode.com/posts.
Oke, jadi bagaimana dengan @FormUrlEncoded? Ini akan menunjukkan bahwa permintaan tersebut akan memiliki tipe MIME-nya (bidang header yang mengidentifikasi format badan permintaan atau tanggapan HTTP) yang ditetapkan ke aplikasi / x-www-form-urlencoded dan juga bahwa nama bidang dan nilainya akan dikodekan UTF-8 sebelum dikodekan URI. Anotasi @Field("key") dengan parameter nama harus sesuai dengan nama yang diharapkan API. Retrofit secara implisit mengubah nilai ke string menggunakan String.valueOf (Object), dan stringnya kemudian membentuk URL yang dikodekan. nilai null diabaikan.
Misalnya, memanggil APIService.savePost (“My Visit To Lagos", "I visited ...", 2) menghasilkan permintaan dari title = My + Visit + To + Lagos & body = I + visited ... & userId = 2.
Menggunakan Anotasi @Body
Kita juga bisa menggunakan anotasi @Body pada parameter metode layanan, alih-alih menentukan bentuk permintaan gaya form dengan sejumlah bidang individual. Objek akan membuat serial menggunakan Retrofit contoh Konverter sepesifik selama pembuatan. Ini hanya digunakan saat melakukan operasi POST atau PUT.
1 |
@POST("/posts")
|
2 |
@FormUrlEncoded |
3 |
Call<Post> savePost(@Body Post post); |
7. Membuat Utilitas API
Kita akan membuat kelas utilitas. Jadi buatlah kelas dalam data.remote dan beri nama ApiUtils. Kelas ini akan memiliki basis URL sebagai variabel statis dan juga akan menyediakan APIService antarmuka dengan metode statis getAPIService() ke bagian aplikasi lainnya.
1 |
package com.chikeandroid.retrofittutorial2.data.remote; |
2 |
|
3 |
public class ApiUtils { |
4 |
|
5 |
private ApiUtils() {} |
6 |
|
7 |
public static final String BASE_URL = "http://jsonplaceholder.typicode.com/"; |
8 |
|
9 |
public static APIService getAPIService() { |
10 |
|
11 |
return RetrofitClient.getClient(BASE_URL).create(APIService.class); |
12 |
}
|
13 |
}
|
Pastikan Anda mengakhiri URL dasar dengan /.
8. Membuat Layout
Berkas activity_main.xml adalah tata letak untuk MainActivity kita. Tata letak ini akan memiliki satu bidang edit teks untuk judul post dan satu lagi untuk body post. Ini juga mencakup tombol untuk mengirimkan post ke API.
1 |
<?xml version="1.0" encoding="utf-8"?> |
2 |
<LinearLayout |
3 |
xmlns:android="http://schemas.android.com/apk/res/android" |
4 |
xmlns:tools="http://schemas.android.com/tools" |
5 |
android:id="@+id/activity_post" |
6 |
android:orientation="vertical" |
7 |
android:layout_width="match_parent" |
8 |
android:layout_height="match_parent" |
9 |
android:paddingLeft="@dimen/activity_horizontal_margin" |
10 |
android:paddingRight="@dimen/activity_horizontal_margin" |
11 |
android:paddingTop="@dimen/activity_vertical_margin" |
12 |
android:paddingBottom="@dimen/activity_vertical_margin" |
13 |
tools:context="com.chikeandroid.retrofittutorial2.AddEditPostActivity"> |
14 |
|
15 |
<TextView |
16 |
android:layout_width="match_parent" |
17 |
android:layout_height="wrap_content" |
18 |
android:gravity="center_horizontal" |
19 |
android:textAppearance="@style/TextAppearance.AppCompat.Title" |
20 |
android:text="@string/title_enter_post"/> |
21 |
<EditText |
22 |
android:id="@+id/et_title" |
23 |
android:layout_marginTop="18dp" |
24 |
android:layout_width="match_parent" |
25 |
android:layout_height="wrap_content" |
26 |
android:hint="@string/hint_title"/> |
27 |
|
28 |
<EditText |
29 |
android:id="@+id/et_body" |
30 |
android:lines="4" |
31 |
android:layout_width="match_parent" |
32 |
android:layout_height="wrap_content" |
33 |
android:hint="@string/hint_body"/> |
34 |
|
35 |
<Button |
36 |
android:id="@+id/btn_submit" |
37 |
android:layout_marginTop="18dp" |
38 |
android:layout_width="match_parent" |
39 |
android:layout_height="wrap_content" |
40 |
android:background="@color/colorAccent" |
41 |
android:textColor="@android:color/white" |
42 |
android:text="@string/action_submit"/> |
43 |
|
44 |
<TextView |
45 |
android:id="@+id/tv_response" |
46 |
android:layout_marginTop="35dp" |
47 |
android:visibility="gone" |
48 |
android:layout_width="match_parent" |
49 |
android:layout_height="wrap_content"/> |
50 |
|
51 |
</LinearLayout> |
9. Melaksanakan permintaan POST
Dalam metode onCreate() di MainActivity, kita menginisialisasi sebuah instance dari antarmuka APIService (baris 14). Kami juga menginisialisasi bidang EditText dan tombol kirim yang akan memanggil metode sendPost() saat diklik (baris 22).
1 |
private TextView mResponseTv; |
2 |
private APIService mAPIService; |
3 |
|
4 |
@Override
|
5 |
protected void onCreate(Bundle savedInstanceState) { |
6 |
super.onCreate(savedInstanceState); |
7 |
setContentView(R.layout.activity_main); |
8 |
|
9 |
final EditText titleEt = (EditText) findViewById(R.id.et_title); |
10 |
final EditText bodyEt = (EditText) findViewById(R.id.et_body); |
11 |
Button submitBtn = (Button) findViewById(R.id.btn_submit); |
12 |
mResponseTv = (TextView) findViewById(R.id.tv_response); |
13 |
|
14 |
mAPIService = ApiUtils.getAPIService(); |
15 |
|
16 |
submitBtn.setOnClickListener(new View.OnClickListener() { |
17 |
@Override
|
18 |
public void onClick(View view) { |
19 |
String title = titleEt.getText().toString().trim(); |
20 |
String body = bodyEt.getText().toString().trim(); |
21 |
if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(body)) { |
22 |
sendPost(title, body); |
23 |
}
|
24 |
}
|
25 |
});
|
26 |
}
|
Dalam metode sendPost(String, String) di kelas MainActivity, kita melewati judul dan body post ke metode ini. Hal yang akan lakukan oleh metode ini adalah memanggil metode antarmuka layanan API kita savePost(String, String) yang tugasnya adalah melaksanakan permintaan POST mengirim judul dan badan (body) ke API. ShowResponse(respon String) akan menampilkan respon di layar.
1 |
public void sendPost(String title, String body) { |
2 |
mAPIService.savePost(title, body, 1).enqueue(new Callback<Post>() { |
3 |
@Override
|
4 |
public void onResponse(Call<Post> call, Response<Post> response) { |
5 |
|
6 |
if(response.isSuccessful()) { |
7 |
showResponse(response.body().toString()); |
8 |
Log.i(TAG, "post submitted to API." + response.body().toString()); |
9 |
}
|
10 |
}
|
11 |
|
12 |
@Override
|
13 |
public void onFailure(Call<Post> call, Throwable t) { |
14 |
Log.e(TAG, "Unable to submit post to API."); |
15 |
}
|
16 |
});
|
17 |
}
|
18 |
|
19 |
public void showResponse(String response) { |
20 |
if(mResponseTv.getVisibility() == View.GONE) { |
21 |
mResponseTv.setVisibility(View.VISIBLE); |
22 |
}
|
23 |
mResponseTv.setText(response); |
24 |
}
|
Instance APIService kita metode mAPIService savePost (String, String) akan kembali melakukan instance Panggilan yang memiliki metode yang disebut enqueue (callback callback).
Pengertian enqueue()
enqueue() secara asinkron mengirimkan permintaan dan memberi tahu aplikasi anda dengan panggilan balik saat ada tanggapan kembali. Karena permintaan ini bersifat asinkron, Retrofit menangani eksekusi di thread latar belakang sehingga untaian UI utama tidak diblokir atau terganggu.
Untuk menggunakan enqueue(), anda harus menerapkan dua metode panggilan balik: onResponse() dan onFailure(). Hanya satu dari metode ini yang akan dipanggil untuk menanggapi permintaan yang diberikan.
-
onResponse(): dipanggil untuk menerima respons HTTP. Metode ini disebut untuk respon yang dapat ditangani dengan benar bahkan jika server mengembalikan pesan kesalahan. Jadi jika mendapat kode status 404 atau 500, metode ini tetap akan dipanggil. Untuk mendapatkan kode status agar anda dapat menangani situasi berdasarkan hal itu, anda dapat menggunakan metoderespon.code(). Anda juga bisa menggunakanisSuccessful()untuk mengetahui apakah kode status berada di kisaran 200-300, yang menunjukkan keberhasilan. -
onFailure(): dipanggil saat pengecualian jaringan terjadi saat berkomunikasi ke server atau saat terjadi pengecualian yang tidak terduga saat menangani permintaan atau memproses respons.
Permintaan Sinkron
Melakukan permintaan sinkron, anda bisa menggunakan execute() dalam sebuah Call instance. Namun perlu disadari bahwa metode sinkron pada thread main/UI akan memblokir tindakan pengguna. Jadi jangan melakukan metode sinkron pada thread main/UI Android! Alih-alih menjalankannya di thread latar belakang.
Menggunakan RxJava
RxJava diintegrasikan ke dalam Retrofit 1 secara default, namun di Retrofit 2 anda perlu memasukkan beberapa tambahan dependencies. Retrofit dilengkapi dengan adaptor default yang mengeksekusi Call instance. Jadi Anda bisa mengubah mekanisme eksekusi Retrofit untuk memasukkan RxJava dengan menyertakan RxJava CallAdapter. Inilah langkah-langkahnya:
Langkah 1
Tambahkan dependensinya.
1 |
compile 'io.reactivex:rxjava:1.1.6' |
2 |
compile 'io.reactivex:rxandroid:1.2.1' |
3 |
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' |
Langkah 2
Tambahkan CallAdapter RxJavaCallAdapterFactory.create() ketika membangun instance Retrofit (baris 5).
1 |
public static Retrofit getClient(String baseUrl) { |
2 |
if (retrofit==null) { |
3 |
retrofit = new Retrofit.Builder() |
4 |
.baseUrl(baseUrl) |
5 |
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) |
6 |
.addConverterFactory(GsonConverterFactory.create()) |
7 |
.build(); |
8 |
}
|
9 |
return retrofit; |
10 |
}
|
Langkah 3
Memperbarui ApiService savePost(String title, String body, String UserId) untuk menjadi mudah diamati.
1 |
@POST("/posts") |
2 |
@FormUrlEncoded
|
3 |
Observable<Post> savePost(@Field("title") String title, |
4 |
@Field("body") String body, |
5 |
@Field("userId") long userId); |
Langkah 4
Saat melakukan permintaan, pelanggan anonim kami merespon arus yang dapat diamati yang menyiarkan kejadian (event), di kasus Post kita. Metode onNext kemudian dipanggil saat pelanggan kami menerima event apapun, yang kemudian diteruskan ke showResponse(String response).
1 |
public void sendPost(String title, String body) { |
2 |
|
3 |
// RxJava
|
4 |
mAPIService.savePost(title, body, 1).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) |
5 |
.subscribe(new Subscriber<Post>() { |
6 |
@Override
|
7 |
public void onCompleted() { |
8 |
|
9 |
}
|
10 |
|
11 |
@Override
|
12 |
public void onError(Throwable e) { |
13 |
|
14 |
}
|
15 |
|
16 |
@Override
|
17 |
public void onNext(Post post) { |
18 |
showResponse(post.toString()); |
19 |
}
|
20 |
});
|
21 |
}
|
Cek Memulai ReactiveX dalam Android oleh Ashraff Hathibelagal untuk mempelajari lebih lanjut tentang RxJava dan RxAndroid.
10. Menguji App
Pada titik ini, anda dapat menjalankan aplikasi dan klik tombol kirim saat anda memasukkan judul dan isi. Tanggapan dari API akan ditampilkan di bawah tombol kirim.



11. Melaksanakan permintaan PUT
Sekarang kita tahu bagaimana cara menjalankan permintaan POST, mari kita lihat bagaimana kita bisa menjalankan PUT yang meminta entitas pembaruan. Tambahkan metode baru berikut ke kelas APIService.
1 |
@PUT("/posts/{id}") |
2 |
@FormUrlEncoded
|
3 |
Call<Post> updatePost(@Path("id") long id, |
4 |
@Field("title") String title, |
5 |
@Field("body") String body, |
6 |
@Field("userId") long userId); |
Untuk memperbarui post dari API, kita memiliki endpoint /post/{id} dengan {id} menjadi placeholder untuk id dari postingan yang ingin kita update. Anotasi @Path adalah penggantian nama di segmen jalur URL {id}. Sadarilah jika nilai dikonversi menjadi string dengan menggunakan String.valueOf(Obyek) dan URL dikodekan. Jika nilainya sudah dikodekan, anda dapat menonaktifkan pengkodean URL seperti ini: @Path(value="name",encoded=true).
12. Melaksanakan Permintaan DELETE
Mari kita lihat bagaimana cara menjalankan permintaan DELETE. Menggunakan JSONPlaceholder API, untuk menghapus sumber posting, endpoint is /posts/{id} dengan metode HTTP DELETE. Kembali ke APIService antarmuka kita, kita hanya perlu memasukkan metode deletePost() yang akan melaksanakannya. Kita melewatkan id dari post ke metode ini, kemudian diganti di segmen jalur URL {id}.
1 |
@DELETE("/posts/{id}")
|
2 |
Call<Post> deletePost(@Path("id") long id);
|
13. Membatalkan Permintaan
Misalnya Anda ingin memberi pengguna kemampuan untuk membatalkan permintaan. Hal ini sangat mudah dilakukan di Retrofit. Kelas Panggilan Retrofit memiliki metode yang disebut cancel() yang akan melakukan hal itu (baris 32 di bawah). Metode ini akan memicu metode onFailure() dalam callback
Cara ini bisa dipanggil, misalnya jika tidak ada koneksi internet atau saat terjadi pengecualian yang tidak terduga membuat respom permintaan atau penanganan. Jadi untuk mengetahui apakah permintaan tersebut dibatalkan, gunakan metode isCancel() dalam kelas panggilan (Call) (baris 20).
1 |
private Call<Post> mCall; |
2 |
|
3 |
...
|
4 |
|
5 |
public sendPost(String title, String body) { |
6 |
mCall = mAPIService.savePost(title, body, 1); |
7 |
mCall.enqueue(new Callback<Post>() { |
8 |
@Override
|
9 |
public void onResponse(Call<Post> call, Response<Post> response) { |
10 |
|
11 |
if(response.isSuccessful()) { |
12 |
showResponse(response.body().toString()); |
13 |
Log.i(TAG, "post submitted to API." + response.body().toString()); |
14 |
}
|
15 |
}
|
16 |
|
17 |
@Override
|
18 |
public void onFailure(Call<Post> call, Throwable t) { |
19 |
|
20 |
if(call.isCanceled()) { |
21 |
Log.e(TAG, "request was aborted"); |
22 |
}else { |
23 |
Log.e(TAG, "Unable to submit post to API."); |
24 |
}
|
25 |
showErrorMessage(); |
26 |
|
27 |
}
|
28 |
});
|
29 |
}
|
30 |
|
31 |
public void cancelRequest() { |
32 |
mCall.cancel(); |
33 |
}
|
Kesimpulan
Dalam tutorial ini, anda belajar tentang Retrofit: mengapa anda harus menggunakannya dan bagaimana mengintegrasikannya ke dalam proyek unutk menampilkan POST, PUT, DELETE dan batalkan permintaan. Anda juga belajar bagaimana mengintegrasikan RxJava dengannya. Di posting berikutnya menggunakan Retrofit, saya akan menunjukkan cara mengunggah file.
Untuk mempelajari lebih lanjut tentang Retrofit, lihat bagian dokumentasi resmi. Dan lihat beberapa tutorial dan kursus kami yang lain tentang pengembangan Android di sini, di Envato Tuts+!















