Kali ini saya akan membagikan tutorial cara membuat RESTful API dengan Framework Laravel, tapi sebelum masuk ke tutorialnya saya akan menjelaskan sedikit tentang REST, RESTful dan API itu sendiri. Ini cukup penting karena ketiganya saling berhubungan dan melengkapi satu sama lain.

Bagi kalian yang sudah lama berkecimpung di dunia web terutama web service, pasti tidak asing lagi dengan istilah RESTful. Tapi banyak juga yang masih bingung antara REST, RESTful, dan API bagaimana mereka bisa terhubung satu sama lain?.

Ok jadi bagi yang belum paham REST( Representional State Transfer ) adalah sebuah software arcitechture yang didesain khusus untuk membuat web service melalui protokol HTTP, jadi REST bisa dibilang menjadi tulang punggung dari web service yang akan dibuat.

Sementara RESTful adalah web service yang menggunakan REST sebagai arsitekturnya, perlu diketahui bahwa tidak semua web service itu berbasis REST ada juga yang menggunakan SOAP( Simple Access Object Protocol ).

Yang terakhir ada API( Application Programing Interface ), API ini adalah sekumpulan kode yang siap pakai yang diperuntukan untuk tujuan tertentu. Misalkan pada Google Map kita ingin mencari titik kordinat dari suatu tempat kita tidak perlu lagi memikirkan perhitungan yang terjadi didalamnya cukup pakai API yang disediakan oleh Google maka masalah terselesaikan.

Dimana dalam web service user( client ) menggunakan protokol HTTP untuk mengakses/request ke sebuah API( server ), dan dari API tersebut seperti yang sudah saya jelankan diatas berisi sekumpulan kode maka akan menghasilkan respon data yang dibutuhkan ke user nah dari penggabungan aktifitas diatas maka lahirlah yang disebut RESTful API.

Ok setelah memahami bagaimana konsep dasar dari RESTful API ini, kita akan coba membuat web service sederhana berbasis RESTful menggunakan framework Laravel tentunya.

 

Persiapan

Ok pertama - tama tentunya install dulu Laravel-nya, setelah instalasi Laravel selesai selanjutnya kita akan menginstall library yang dinamakan dingo api. Nah dari library ini akan meng-handle keperluan untuk membangun RESTful API mulai dari routing, response, formatter, hingga error.

Untuk menginstallnya cukup tambahkan library-nya pada file composer.json.

"require": {
    "dingo/api": "^2"
}

Kemudian jalankan composer update.

composer update

Jika proses instalasi sudah selesai maka kita bisa lanjut ketahap berikutnya.

Oh iya sebelum ketahap berikutnya untuk mengetest api nantinya kita akan menggunakan postman, jadi jika belum punya silahkan download dan install terlebih dahulu.

 

Konfigurasi

Untuk mempublish file config-nya bisa jalankan perintah berikut.

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

Setelah file api.php terpublish selanjutnya buka file .env kemudian buat tambahkan variabel berikut.

API_PREFIX=api
API_DEBUG=true

API_PREFIX untuk menentukan prefix untuk route api yang kita buat nantinya, sementara API_DEBUG untuk keperluan debugging agar jika terjadi error maka akan menghasilkan message error. Sebenarnya ada banyak yang kalian bisa konfigurasi seperti nama api, versi, format error dll kalian bisa explore sendiri file-nya di config/api.php.

 

Membuat Endpoint

Langkah selanjutnya yaitu membuat endpoint atau jalur masuk utama dari api yang kita buat. Kita bisa membuat endpoint pada file web.php atau api.php.

Sebagai contoh kita akan buat endpoint-nya pada file api.php, seperti yang saya katakan library dingo api ini sudah menjadi paket lengkap untuk membuat RESTful API jadi segala kebutuhannya ada pada library ini termasuk routing.

Kita inisialisasi terlebih dahulu routing dari dingo api, semua proses ini dilakukan di file api.php tempat kita membuat endpoint nantinya.

$api = app('Dingo\Api\Routing\Router');

Setelah diinisialisasi baru kita buat endpoint-nya.

$api->version('v1', function($api) {
    // All routes goes here
});

Nah disini bagian pentingnya, semua route kita nantinya akan dibungkus dengan version group dimana versi disini harus sama dengan yang ada pada file config/api.php tadi.

Ok sekarang kita test apakah semua berjalan lancar atau tidak, kita akan coba buat route test dengan return 1.

$api->get('test', function() {
     return 1;
});

Jangan lupa jalankan Laravel virtual server-nya.

php artisan serve

Kemudian buka aplikasi postman dan menuju url /api/test , jika responnya 1 api route yang kalian buat tidak ada masalah.

Jika kalian mendapat error disini silahkan langsung dikolom komentar ya :) .

 

RESTful API

Migration

Sekarang kita akan coba buat RESTful API sederhana, API-nya akan menangani operasi CRUD( Create, Read, Update, Delete ) dan data yang digunakan adalah data dari tabel members

Pertama buatlah migration terlebih dahulu, disini saya asumsikan kalian sudah mengkonfigurasi database pada file .env.

php artisan make:migration create_members_table

Kemudian schema kurang lebih seperti berikut.

Schema::create('members', function (Blueprint $table) {
       $table->bigIncrements('id');
       $table->string('name');
       $table->string('email')->unique();
       $table->integer('age')->unsigned();
       $table->text('address');
       $table->timestamps();
});

Lalu kemudian migrate.

php artisan migrate

Model dan Transformer

Setelah proses migrate selesai, ada 2 hal yang harus dipersiapkan yaitu Model dan Transformer. Untuk model saya anggap kalian sudah mengerti bagaimana cara membuat Model di Laravel. Nah untuk Transformer sendiri kita akan buat manual karena tidak ada command untuk meng-generate Transformer.

Bagi yang belum tahu, Transformer bertugas untuk mentransform data yang dihasilkan dari model sehingga hasil response bisa lebih readable bagi user dan juga bisa lebih konsisten.

Langsung saja yang pertama kita buat dulu sebuah Transformer untuk model Member. Pada folder app buat folder baru dengan nama Transformers, nah disinilah kita akan menampung kelas - kelas transformer yang lainnya.

Buat dengan nama MemberTransformer.php dengan isi sebagai berikut.

<?php

namespace App\Transformers;

use League\Fractal\TransformerAbstract;
use App\Member;

class MemberTransformer extends TransformerAbstract
{
    public function transform(Member $member) {
        return [
            'id' => $member->id,
            'name' => $member->name,
            'email' => $member->email,
            'age' => $member->age,
            'address' => $member->address
        ];
    }
}

Seperti yang saya katakan Transformer bertugas untuk mentransform data dari Model, jadi kita bebas membuat bentuk dari data yang akan diterima user sebelumnya. Misalkan saya ingin menerima data dengan bahasa Indonesia saya tinggal merubah key menjadi bahasa Indonesia.

Karna Transformer membutuhkan Model yang bersangkutan jadi sekarang kita buat Model untuk Member.

php artisan make:model Member

Member.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    protected $fillable = [
        'name',
        'email',
        'age',
        'address'
    ];
}

 

Controller dan Route

Ok sekarang tinggal buat Controller dan Route. Untuk Controller terdapat sedikit perbedaan pada bagian responsenya, kita akan menggunakan response dari dingo api yang nantinya data dari model akan ditransform oleh Transformer.

Controller

Kita buat Controller dengan nama MemberController.

php artisan make:controller MemberController

Oh iya sedikit tips, ketika membangun RESTful API dengan Laravel sangat direkomendasikan untuk memisahkan antara Controller untuk API dan Controller biasa agar lebih terstruktur dan tidak tidak bercampur dengan Controller lainnya.

Jadi kita buat 1 folder lagi pada folder app/Http/Controllers dengan nama Api lalu pindahkan MemberController ke folder Api yang sudah dibuat dan jangan lupa mengganti namespacenya tambahkan \Api.

namespace App\Http\Controllers\Api;

Sekarang tinggal kita buat method - method yang diperlukan untuk operasi CRUD, ada 5 method yang dibutuhkan yaitu: index, show, store, update, delete.

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Member;
use App\Transformers\MemberTransformer;
use Dingo\Api\Routing\Helpers;

class MemberController extends Controller
{
    use Helpers;

    public function index()
    {
        return $this->response->collection(Member::all(), new MemberTransformer);
    }

    public function show($id)
    {
        return $this->response->item(Member::find($id), new MemberTransformer);
    }

    public function store(Request $request)
    {
        Member::create($request->all());

        return response()->json([
            'status' => 'ok',
            'message' => 'Member was created!'
        ], 200);
    }

    public function update($id, Request $request)
    {
        Member::find($id)->update($request->all());

        return response()->json([
            'status' => 'ok',
            'message' => 'Member was updated'
        ], 200);
    }

    public function delete($id)
    {
        Member::destroy($id);

        return response()->json([
            'status' => 'ok',
            'message' => 'Member was deleted'
        ], 200);
    }
}

Kurang lebih bentuk Controllernya seperti itu. Untuk respon data ke user saya menggunakan response helper dari dingo api ada $this->response->collection untuk banyak data dan $this->response->item untuk single data.

Route

Ok sekarang tinggal buat route untuk masing - masing method yang ada di MemberController.

$api->group(['namespace' => 'App\Http\Controllers\Api'], function() use($api) {

    $api->get('members', 'MemberController@index');
    $api->get('members/{id}', 'MemberController@show');
    $api->post('members', 'MemberController@store');
    $api->put('members/{id}/update', 'MemberController@update');
    $api->delete('members/{id}/delete', 'MemberController@delete');

});

 

Testing

Ok semua persiapan sudah selesai waktunya untuk testing semua route yang sudah dibuat.

1. Index

Untuk sementara karna belum ada data jadi responnya seperti itu.

2. create

Jika ingin menjalankan create data tinggal ganti method menjadi POST dan isi datanya pada tab Body dengan format json. Nah jika kita coba lagi ke route sebelumnya maka akan terlihat data yang sudah dicreate sebelumnya.

Struktur dari respon data yang diterima pasti sama seperti yang ada dalam MemberTransformer dan kita dapat sewaktu - waktu merubah strukturnya disaat dibutuhkan.

Jika diperhatikan key data pada json adalah berupa array karena kita sedang me-request route method index, jika kita ingin mendapatkan data user dengan id tertentu gunakan route method show.

3. show

Nah disana bisa dilihat bedanya, sekarang respon data pada route method show menghasilkan single object.

 

Ok sisanya kalian bisa explore sendiri dan jika ada yang mau ditanyakan atau didiskusikan langsung dikolom komentar ya.
Untuk kalian yg lagi cari monitor atau aksesoris seperti keyboard, mousepad dan mouse bisa lihat rekomendasi saya di tokopedia ya.

Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY