REST API Client Sederhana dengan Retrofit pada Android Studio

Nugroho Ardi Sutrisno 14 Februari 2017

REST API Client Sederhana dengan Retrofit pada Android Studio

Pada arsitektur REST, REST server menyediakan resources yang direpresentasikan dalam bentuk format teks, JSON atau XML. JSON singkatan dari JavaScript Object adalah suatu format ringkas pertukaran data yang sering digunakan untuk mentransmisikan data terstruktur melalui suatu koneksi jaringan pada suatu proses yang disebut serialisasi dan dapat direpresentasikan oleh berbagai bahsa pemrograman.

Resource yang berbentuk format JSON yang disediakan REST server dapat dimanfaatkan oleh aplikasi android dengan library Retrofit. Retrofit adalah library Rest Client untuk android dan java dari squareup.

Sebagai contoh penerapan REST API Client pada aplikasi android dibawah ini akan dijelaskan langkah-langkah pembuatan REST API Client dengan android studio yang akan memanfaatkan sumber daya dari REST API server yang sebelumnya telah dibuat di Aplikasi web REST API Client Sederhana dengan Codeigniter 3.

Persiapan Server

Dalam pembuatan Rest api client ini diperlukan :

  1. Webserver seperti Xampp, Wampp, dan lainnya.
  2. REST API Server yang sebelumnya dibuat pada Aplikasi web REST API Client Sederhana dengan Codeigniter 3.

Setelah semua yang dibutuhkan telah siap dan REST server telah dapat bekerja, buat file php baru dengan nama kontak_android.php pada direktori rest_ci/application/controllers/

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

require APPPATH . '/libraries/REST_Controller.php';
use Restserver\Libraries\REST_Controller;
class Kontak_android extends REST_Controller {

    function __construct($config = 'rest') {
        parent::__construct($config);
    }

    //Menampilkan data kontak
    function index_get() { 
        $kontak = $this->db->get('telepon')->result();
        $this->response(array("result"=>$kontak, 200));
    }

}
?>

Persiapan Client

Untuk menguji keberhasilan aplikasi yang akan dibuat, siapkan smartphone android untuk meng-compile aplikasi dan pastikan smartphone tersebut dan komputer anda berada pada satu jaringan LAN/WLAN. Jika perlu catat alamat ip komputer anda yang terhubung satu jaringan dengan smartphone untuk konfigurasi REST client nantinya.

  1. Buat project baru dengan nama "kontak" lalu klik next, pilih versi android minimal android 5.1 lalu klik next, pilih empty activity lalu klik next, selanjutnya klik finish.
  2. Buat 2 activity baru dengan nama InsertActivity dan EditActivity dengan cara klik kanan pada logo folder java pilih new, pilih activity, lalu klik empty activity.
  3. Buat 3 package baru dengan nama Adapter, Model, dan Rest dengan cara klik kanan pada package kontak pilih new, klik package. Sehingga struktur package akan menjadi seperti dibawah ini
  4. Buka AndroidManifest.xml pada package manifests dan tambahkan <uses-permission android:name="android.permission.INTERNET"/> sebelum tag <aplication ...></aplication>
  5. Buka build.gradle(Module:App) tambahkan
    // retrofit, gson
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    //recyclerview
    compile 'com.android.support:recyclerview-v7:24.2.0'

lalu lalu "sync now" di pojok atas kanan dan pastikan koneksi internet dalam keadaan aktif, sehingga menjadi

Model

Di dalam package Model buat 3 buah class baru dengan nama Kontak, GetKontak, PostPutDelKontak.

Kontak

Class kontak berisi constructor dari atribut-atribut yang diperlukan pada REST server kontak dan setter dan getter untuk masing-masing atribut tersebut.

package com.example.root.kontak.Model;

import com.google.gson.annotations.SerializedName;

/**
 * Created by root on 2/3/17.
 */

public class Kontak {
    @SerializedName("id")
    private String id;
    @SerializedName("nama")
    private String nama;
    @SerializedName("nomor")
    private String nomor;

    public Kontak(){}

    public Kontak(String id, String nama, String nomor) {
        this.id = id;
        this.nama = nama;
        this.nomor = nomor;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }

    public String getNomor() {
        return nomor;
    }

    public void setNomor(String nomor) {
        this.nomor = nomor;
    }
}

GetKontak

Class GetKontak berfungsi untuk mengimprentasikan respon dari REST server dalam hal menampilkan data.

package com.example.root.kontak.Model;

import com.google.gson.annotations.SerializedName;

import java.util.List;

/**
 * Created by root on 2/3/17.
 */

public class GetKontak {
    @SerializedName("status")
    String status;
    @SerializedName("result")
    List<Kontak> listDataKontak;
    @SerializedName("message")
    String message;
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public List<Kontak> getListDataKontak() {
        return listDataKontak;
    }
    public void setListDataKontak(List<Kontak> listDataKontak) {
        this.listDataKontak = listDataKontak;
    }
}

PostPutDelKontak

Class GetKontak berfungsi untuk mengimprentasikan respon dari REST server dalam hal manipulasi data.

package com.example.root.kontak.Model;

import com.google.gson.annotations.SerializedName;

/**
 * Created by root on 2/3/17.
 */

public class PostPutDelKontak {
    @SerializedName("status")
    String status;
    @SerializedName("result")
    Kontak mKontak;
    @SerializedName("message")
    String message;
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Kontak getKontak() {
        return mKontak;
    }
    public void setKontak(Kontak Kontak) {
        mKontak = Kontak;
    }    
    
}

Rest

Pada package Rest buat sebuah class baru dengan nama ApiClient dan sebuah Interface baru dengan nama ApiInterface.

ApiClient

Dalam ApiClient terdapat fungsi untuk membuat koneksi dengan Rest server dan konfigurasi dari alamat Ip komputer yang berperan sebagai Rest server disini alamat Ip saya 192.168.43.201 diikuti directori akses dari Rest server tersebut.

package com.example.root.kontak.Rest;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by root on 2/3/17.
 */

public class ApiClient {
        public static final String BASE_URL = "http://192.168.43.201/rest_ci/index.php/";
        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;
        }
}

ApiInterface

Pada ApiInterface terdapat metode-metode yang akan digunakan dalam komunikasi data dengan Rest server serta atribut-atribut yang digunakan dalam komunikasi data tersebut.

package com.example.root.kontak.Rest;

/**
 * Created by root on 2/3/17.
 */

import com.example.root.kontak.Model.GetKontak;
import com.example.root.kontak.Model.PostPutDelKontak;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.POST;
import retrofit2.http.PUT;

public interface ApiInterface {
    @GET("kontak_android")
    Call<GetKontak> getKontak();
    @FormUrlEncoded
    @POST("kontak")
    Call<PostPutDelKontak> postKontak(@Field("nama") String nama,
                                      @Field("nomor") String nomor);
    @FormUrlEncoded
    @PUT("kontak")
    Call<PostPutDelKontak> putKontak(@Field("id") String id,
                                     @Field("nama") String nama,
                                     @Field("nomor") String nomor);
    @FormUrlEncoded
    @HTTP(method = "DELETE", path = "kontak", hasBody = true)
    Call<PostPutDelKontak> deleteKontak(@Field("id") String id);
}

Adapter

Adapter disini akan digunakan untuk menampilkan data ke dalam RecyclerView. Buat class baru pada package Adapter dengan nama AdapterKontak dan buat layout baru pada pakage res/layout dengan cara klik kanan pada folder layout pilih new lalu klik "layout resource file" beri nama file layout tersebut Kontak_list.

Kontak_list

Pada layout Kontak_list terdapat TextView untuk id, nama, dan nomor.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp">
        <TextView
            android:id="@+id/tvId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Id"
            android:layout_alignParentRight="true"
            android:textSize="15sp"
            android:textStyle="bold"
            />
        <TextView
            android:id="@+id/tvNama"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Nama"
            android:layout_below="@id/tvId"
            android:textSize="15sp"
            />
        <TextView
            android:id="@+id/tvNomor"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Nomor"
            android:textSize="15sp"
            android:layout_below="@id/tvNama"
            />
    </RelativeLayout>
    <View
        android:background="@color/colorPrimary"
        android:layout_width="match_parent"
        android:layout_height="5dp"/>
</LinearLayout>

KontakAdapter

Dengan KontakAdapter RecyclerView pada MainActivity akan menampilkan data yang diterima dengan layout yang telah didefinisikan pada kontak_list.

package com.example.root.kontak.Adapter;

import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.root.kontak.EditActivity;
import com.example.root.kontak.Model.Kontak;
import com.example.root.kontak.R;

import java.util.List;

/**
 * Created by root on 2/3/17.
 */

public class KontakAdapter extends RecyclerView.Adapter<KontakAdapter.MyViewHolder>{
        List<Kontak> mKontakList;

        public KontakAdapter(List <Kontak> KontakList) {
            mKontakList = KontakList;
        }

        @Override
        public MyViewHolder onCreateViewHolder (ViewGroup parent,int viewType){
            View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.kontak_list, parent, false);
            MyViewHolder mViewHolder = new MyViewHolder(mView);
            return mViewHolder;
        }

        @Override
        public void onBindViewHolder (MyViewHolder holder,final int position){
            holder.mTextViewId.setText("Id = " + mKontakList.get(position).getId());
            holder.mTextViewNama.setText("Nama = " + mKontakList.get(position).getNama());
            holder.mTextViewNomor.setText("Nomor = " + mKontakList.get(position).getNomor());
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent mIntent = new Intent(view.getContext(), EditActivity.class);
                    mIntent.putExtra("Id", mKontakList.get(position).getId());
                    mIntent.putExtra("Nama", mKontakList.get(position).getNama());
                    mIntent.putExtra("Nomor", mKontakList.get(position).getNomor());
                    view.getContext().startActivity(mIntent);
                }
            });
        }

        @Override
            public int getItemCount () {
            return mKontakList.size();
        }

        public class MyViewHolder extends RecyclerView.ViewHolder {
            public TextView mTextViewId, mTextViewNama, mTextViewNomor;

            public MyViewHolder(View itemView) {
                super(itemView);
                mTextViewId = (TextView) itemView.findViewById(R.id.tvId);
                mTextViewNama = (TextView) itemView.findViewById(R.id.tvNama);
                mTextViewNomor = (TextView) itemView.findViewById(R.id.tvNomor);
            }
        }
}

MainActivity

Image

MainActivity terdiri dari layout MainActivity.xml pada package res/layout dan MainActivity.java pada package java/kontak.

MainActivity.xml

Pada layout MainActivity.xml terdapat Tombol untuk membuka form InsertActivity dan RecyclerView yang menampilkan data kontak.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.root.kontak.MainActivity">
    <Button
        android:id="@+id/btIns"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Insert"
        android:layout_margin="10dp"/>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/btIns">
    </android.support.v7.widget.RecyclerView>
</RelativeLayout>

MainActivity.java

package com.example.root.kontak;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.root.kontak.Adapter.KontakAdapter;
import com.example.root.kontak.Model.GetKontak;
import com.example.root.kontak.Model.Kontak;
import com.example.root.kontak.Rest.ApiClient;
import com.example.root.kontak.Rest.ApiInterface;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {
    Button btIns;
    ApiInterface mApiInterface;
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    public static MainActivity ma;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btIns = (Button) findViewById(R.id.btIns);
        btIns.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, InsertActivity.class));
            }
        });
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mApiInterface = ApiClient.getClient().create(ApiInterface.class);
        ma=this;
        refresh();        
    }

    public void refresh() {
        Call<GetKontak> kontakCall = mApiInterface.getKontak();
        kontakCall.enqueue(new Callback<GetKontak>() {
            @Override
            public void onResponse(Call<GetKontak> call, Response<GetKontak>
                    response) {
                List<Kontak> KontakList = response.body().getListDataKontak();
                Log.d("Retrofit Get", "Jumlah data Kontak: " +
                        String.valueOf(KontakList.size()));
                mAdapter = new KontakAdapter(KontakList);
                mRecyclerView.setAdapter(mAdapter);
            }

            @Override
            public void onFailure(Call<GetKontak> call, Throwable t) {
                Log.e("Retrofit Get", t.toString());
            }
        });
    }
}

InsertActivity

Image

InsertActivity terdiri dari layout InsertActivity.xml pada package res/layout dan InsertActivity.java pada package java/kontak.

InsertActivity.xml

Pada layout InsertActivity.xml berisi EditText untuk nama dan nomor serta Button untuk tombol Back dan Insert.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_insert"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.root.kontak.InsertActivity">
    <TextView
        android:id="@+id/tvNama"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Nama : "
        android:textSize="20sp"/>
    <TextView
        android:id="@+id/tvNomor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Nomor : "
        android:layout_below="@id/tvNama"
        android:textSize="20sp"/>
    <EditText
        android:id="@+id/edtNama"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Nama"
        android:layout_toRightOf="@+id/tvNama"
        android:layout_alignBaseline="@+id/tvNama"/>
    <EditText
        android:id="@+id/edtNomor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Nomor"
        android:layout_toRightOf="@+id/tvNomor"
        android:layout_alignBaseline="@+id/tvNomor"/>
    <LinearLayout
        android:id="@+id/Linearlayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_below="@+id/tvNomor"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp">
        <Button
            android:id="@+id/btInserting"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Insert"/>
        <Button
            android:id="@+id/btBackGo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Back"/>
    </LinearLayout>

</RelativeLayout>

InsertActivity.java

package com.example.root.kontak;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.root.kontak.Model.PostPutDelKontak;
import com.example.root.kontak.Rest.ApiClient;
import com.example.root.kontak.Rest.ApiInterface;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class InsertActivity extends AppCompatActivity {
    EditText edtNama, edtNomor;
    Button btInsert, btBack;
    ApiInterface mApiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);
        edtNama = (EditText) findViewById(R.id.edtNama);
        edtNomor = (EditText) findViewById(R.id.edtNomor);
        mApiInterface = ApiClient.getClient().create(ApiInterface.class);
        btInsert = (Button) findViewById(R.id.btInserting);
        btInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Call<PostPutDelKontak> postKontakCall = mApiInterface.postKontak(edtNama.getText().toString(), edtNomor.getText().toString());
                postKontakCall.enqueue(new Callback<PostPutDelKontak>() {
                    @Override
                    public void onResponse(Call<PostPutDelKontak> call, Response<PostPutDelKontak> response) {
                        MainActivity.ma.refresh();
                        finish();
                    }

                    @Override
                    public void onFailure(Call<PostPutDelKontak> call, Throwable t) {
                        Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
                    }
                });
            }
        });

        btBack = (Button) findViewById(R.id.btBackGo);
        btBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.ma.refresh();
                finish();
            }
        });
    }
}

EditActivity

Image

EditActivity terdiri dari layout EditActivity.xml pada package res/layout dan EditActivity.java pada package java/kontak.

EditActivity.xml

Pada layout EditActivity.xml terdapat EditText untuk id, nama, dan nomor serta Button untuk Tombol update, delete, dan back.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_edit"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.root.kontak.EditActivity">
        <TextView
            android:id="@+id/tvId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Id Kontak : "
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tvNama"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Nama : "
            android:layout_below="@id/tvId"
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tvNomor"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Nomor : "
            android:layout_below="@id/tvNama"
            android:textSize="20sp"/>
        <EditText
            android:id="@+id/edtId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Id"
            android:layout_toRightOf="@+id/tvId"
            android:layout_alignBaseline="@+id/tvId"/>
        <EditText
            android:id="@+id/edtNama"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Nama"
            android:layout_alignBaseline="@+id/tvNama"
            android:layout_alignLeft="@+id/edtId"/>
        <EditText
            android:id="@+id/edtNomor"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Nomor"
            android:layout_alignBaseline="@+id/tvNomor"
            android:layout_alignLeft="@+id/edtId"
            android:inputType="date"/>
        <LinearLayout
            android:id="@+id/Linearlayout2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_below="@+id/tvNomor"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp">

            <Button
                android:id="@+id/btUpdate2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Update"/>

            <Button
                android:id="@+id/btDelete2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Delete"/>
            <Button
                android:id="@+id/btBackGo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Back"/>
        </LinearLayout>
</RelativeLayout>

EditActivity.java

package com.example.root.kontak;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.root.kontak.Model.PostPutDelKontak;
import com.example.root.kontak.Rest.ApiClient;
import com.example.root.kontak.Rest.ApiInterface;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class EditActivity extends AppCompatActivity {
    EditText edtId, edtNama, edtNomor;
    Button btUpdate, btDelete, btBack;
    ApiInterface mApiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit);
        edtId = (EditText) findViewById(R.id.edtId);
        edtNama = (EditText) findViewById(R.id.edtNama);
        edtNomor = (EditText) findViewById(R.id.edtNomor);
        Intent mIntent = getIntent();
        edtId.setText(mIntent.getStringExtra("Id"));
        edtId.setTag(edtId.getKeyListener());
        edtId.setKeyListener(null);
        edtNama.setText(mIntent.getStringExtra("Nama"));
        edtNomor.setText(mIntent.getStringExtra("Nomor"));
        mApiInterface = ApiClient.getClient().create(ApiInterface.class);
        btUpdate = (Button) findViewById(R.id.btUpdate2);
        btUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Call<PostPutDelKontak> updateKontakCall = mApiInterface.putKontak(
                        edtId.getText().toString(),
                        edtNama.getText().toString(),
                        edtNomor.getText().toString());
                updateKontakCall.enqueue(new Callback<PostPutDelKontak>() {
                    @Override
                    public void onResponse(Call<PostPutDelKontak> call, Response<PostPutDelKontak> response) {
                        MainActivity.ma.refresh();
                        finish();
                    }

                    @Override
                    public void onFailure(Call<PostPutDelKontak> call, Throwable t) {
                        Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
                    }
                });
            }
        });
        btDelete = (Button) findViewById(R.id.btDelete2);
        btDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (edtId.getText().toString().trim().isEmpty()==false){
                    Call<PostPutDelKontak> deleteKontak = mApiInterface.deleteKontak(edtId.getText().toString());
                    deleteKontak.enqueue(new Callback<PostPutDelKontak>() {
                        @Override
                        public void onResponse(Call<PostPutDelKontak> call, Response<PostPutDelKontak> response) {
                            MainActivity.ma.refresh();
                            finish();
                        }

                        @Override
                        public void onFailure(Call<PostPutDelKontak> call, Throwable t) {
                            Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
                        }
                    });
                }else{
                    Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
                }
            }
        });
        btBack = (Button) findViewById(R.id.btBackGo);
        btBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.ma.refresh();
                finish();
            }
        });
    }
}

Setelah semua activity dan model telah selesai dibuat, compile aplikasi tersebut ke dalam smartphone android yang telah terhubung dalam satu jaringan dengan komputer yang menyediakan Rest server yang sebelumnya telah dibuat.