Kadang kala dalam urusan dengan API kita akan mendapati request yang tidak biasa kita jumpai dimana tutorial di internet beredar, salah satu kasus disini adalah jika kita berurusan dengan dinamis key value request post, contohnya seperti berikut ini.

Langkah pertama yang perlu temen — temen perhatikan dalam proses mengembangkan aplikasi adalah belajar bahasa inggris dan baca dokumentasi dari sebuah library yang kalian pakai dengan seksama.
Nah disini kalau kita baca dengan seksama pada dokumentasi retrofit maka kita akan dapati keterangan berikut ini pada penjelasan REQUEST BODY.

Disini jelas sekali kita bisa menggunakan RequestBody yang di mana ini adalah sebuah object yang di gunakan untuk request pada OkHttp. So dengan begini kita bisa menggunakan RequestBody ini untuk mengatasi custom request di retrofit yang sedikit rumit.
Request Body
Nah yang perlu di ketahui adalah retrofit ini di buat di atas OkHttp, yang dimana okhttp ini cukup sangat customable dalam hal request dan response, menggunakan builder pattern akan memudahkan dan mempercepat kita dalam munggunakan retrofit ini.
Dalam kasus ini kita dapati sebuah key value array pada data yang akan kita post ke server dari API kita. Nah untuk itu kita tidak bisa menggunakan pojo dalam requestbody dari retrofit. Untuk itu kita bisa menggunakan request mutltipart body, karena request multipart body ini bisa kita gunakan untuk store key-valuepair.
OK kali ini kita langsung pada latihan mengimplementasikan teori yang telah kita bahas pada project latihan kita. Pada latihan ini kita akan coba buat sebuah aplikasi post sederhana yang kita — kita seperti ini tampilanya.

ApiServices
Seperti biasa retrofit butuh satu inteface untuk mengakses Endpoint teretentu dari sebuah API.
1 2 3 4 5 |
public interface ApiServices { @POST("/index.php") Flowable<ResponseModel> sendData(@Body RequestBody body); } |
ResponseModel
Disini kita akan definisikan pojo dari data yang kita terima dari server setelah kita melakukan interaksi dengan server.
Berikut ini bentun JSON nya :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "id": "1", "key": [ { "nama": "Ahmad Rosid", "alamat": "Yogyakarta" }, { "nama": "Putri Indah Nuraini", "alamat": "Lampung Timur" } ] } |
Dan Berikut ini bentuk POJO nya :
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 |
public class ResponseModel { <em class="markup--em markup--pre-em">/** * id : 1 * key : [{"nama":"Ahmad Rosid","alamat":"Yogyakarta"},{"nama":"Putri Indah Nuraini","alamat":"Lampung Timur"}] */ </em>private String id; private List<KeyBean> key; public String getId() { return id; } public void setId(String id) { this.id = id; } public List<KeyBean> getKey() { return key; } public void setKey(List<KeyBean> key) { this.key = key; } public static class KeyBean { <em class="markup--em markup--pre-em">/** * nama : Ahmad Rosid * alamat : Yogyakarta */ </em>private String nama; private String alamat; public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this.alamat = alamat; } } |
Eksekusi API
Nah berikut ini cara melakukan ekseskusi dari API nya.
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 |
private void sendDataToServer() { OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { Log.<em class="markup--em markup--pre-em">d</em>("Intercept_LOG", "log: "+message); } }); httpClient.addInterceptor(logging); OkHttpClient client = httpClient.build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://ocit-tutorial.herokuapp.com") .addConverterFactory(GsonConverterFactory.<em class="markup--em markup--pre-em">create</em>()) .addCallAdapterFactory(RxJava2CallAdapterFactory.<em class="markup--em markup--pre-em">create</em>()) .client(client) .build(); ApiServices apiServices = retrofit.create(ApiServices.class); MultipartBody.Builder mutipartBuilder = new MultipartBody.Builder(); mutipartBuilder.setType(MultipartBody.<em class="markup--em markup--pre-em">FORM</em>); mutipartBuilder.addFormDataPart("id", "1"); mutipartBuilder.addFormDataPart("key[0][nama]", name1.getText().toString()); mutipartBuilder.addFormDataPart("key[0][alamat]", address1.getText().toString()); mutipartBuilder.addFormDataPart("key[1][nama]", name2.getText().toString()); mutipartBuilder.addFormDataPart("key[1][alamat]", address2.getText().toString()); MultipartBody multipartBody = mutipartBuilder.build(); setLoading(true); Disposable subscribe = apiServices.sendData(multipartBody) .subscribeOn(Schedulers.<em class="markup--em markup--pre-em">io</em>()) .observeOn(AndroidSchedulers.<em class="markup--em markup--pre-em">mainThread</em>()) .subscribe(new Consumer<ResponseModel>() { @Override public void accept(ResponseModel responseModel) throws Exception { setLoading(false); alert("Berhasil\n\n"+new Gson().toJson(responseModel)); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { Log.<em class="markup--em markup--pre-em">e</em>("ERROR_TAG", "accept: ", throwable); setLoading(false); alert("Gagal"); } }); disposable.add(subscribe); } |
Yang perlu di cermati adalah bagian ini, bagian request body, jadi kita hanya tinggal perlu menambahkan data pada addFormDataPart sesuai key yang di perlukan.
1 2 3 4 5 6 7 8 9 |
MultipartBody.Builder mutipartBuilder = new MultipartBody.Builder(); mutipartBuilder.setType(MultipartBody.<em class="markup--em markup--pre-em">FORM</em>); mutipartBuilder.addFormDataPart("title", "Square Logo"); mutipartBuilder.addFormDataPart("id", "1"); mutipartBuilder.addFormDataPart("key[0][nama]", name1.getText().toString()); mutipartBuilder.addFormDataPart("key[0][alamat]", address1.getText().toString()); mutipartBuilder.addFormDataPart("key[1][nama]", name2.getText().toString()); mutipartBuilder.addFormDataPart("key[1][alamat]", address2.getText().toString()); MultipartBody multipartBody = mutipartBuilder.build(); |
OK sampai disini dulu sedikit tips ini, mudah — mudahan membantu ya. Dan tulisan ini special untuk rekan kerjanya mas Dedy Yugo Purwanto yang belum tahu retrofit itu bisa digunakan untuk ngepost array key-valuepair, semoga bermanfaat ya.
Jangan pernah bilang tidak bisa kalau belum dicoba karena di dunia programmer bukan tempatnya orang yang selalu bilang tidak bisa.
Nah untuk source code dari aplikasi ini silahkan di ambil dari github saya melalui link dibawah ini.
Jangan lupa untuk berikan claps untuk tutorial ini yaks. Sampai ketemu pada tutorial selanjutnya.