Implementasi REST sederhana dengan MongoDB dan Silex

Muhammad Arslan 14 Februari 2016

Implementasi REST sederhana dengan MongoDB dan Silex

Pendahuluan

REST merupakan kependekan dari representational state transfer. Menurut REST Api Tutorial,REST adalah mekanisme alternatif yang lebih ringan dibandingkan RPC, SOAP, atau CORBA. REST sendiri memiliki implementasi yang berbeda - beda, jadi setiap orang dapat membuat versinya sendiri.

REST menggunakan HTTP Verb untuk melakukan proses operasi. Berikut adalah sejumlah HTTP Verb yang umum digunakan:

  • GET, mendapatkan response berupa xml, json atau text
  • HEAD, memberikan response berupa metadata
  • POST, melakukan proses penciptaan data baru dengan mengirim request body berupa form-data, x-www-form-urlencoded, atau lainnya
  • PUT, melakukan proses update terhadap suatu data dengan mengirim request body dan id dari suatu data
  • DELETE, menghapus sebuah data berdasarkan id atau parameter tertentu
Sedangkan beberapa status code yang digunakan adalah sebagai berikut:
  • 200, resource yang diinginkan ada
  • 404, resource yang diinginkan tidak ada
  • 500, terjadi error saat meminta resource
  • 201, resource baru telah diciptakan
  • dan lainnya.
Bila Taylor Otwell menciptakan Lumen dengan menggunakan komponen - komponen Laravel, maka SensioLabs mempunyai Silex. Silex sendiri merupakan sebuah micro web framework yang dikembangkan oleh SensioLabs dengan berbasiskan komponen - komponen Symfony. Ukuran file source code mentahnya pun terhitung ringan. Silex berukuran sebesar 1.6 MB sudah termasuk dependency library bawaan yang dikelola menggunakan Composer. Berbeda dengan beberapa micro web framework lain yang cukup besar ukurannya. Silex ini mendukung pembangunan web service salah satunya dengan konsep REST.

Persiapan alat

Anda pun dapat dengan mudah memilih jalan tanpa harus menggunakan Composer bila ingin menggunakan cara yang praktis. Untuk menggunakan Silex tidaklah ribet. Anda cukup mengunduh file .zip dari website resminya. Kemudian simpan di folder htdocs atau /var/www/html tempat Anda biasa mengembangkan aplikasi PHP.

Kita akan menggunakan MongoDB untuk menyimpan setiap data yang akan diterima oleh Silex. Anda dapat mengikuti tutorial pengenalan MongoDB di Codepolitan Tutorial untuk memahami dan menguasai sedikit query dan konsep MongoDB.

perlengkapan yang akan kita butuhkan antara lain:

  • XAMPP (bagi pengguna Windows atau Linux) atau Apache dan PHP5 bagi yang tidak ingin memasang Apache secara terpisah (bagi pengguna Linux atau BSD)
  • MongoDB (Anda dapat mengunduhnya dari website resmi MongoDB)
  • Code Editor, Anda dapat menggunakan code editor favorit Anda
  • POSTMAN, sebuah aplikasi untuk mencoba aplikasi web yang melayani web service semisal REST. POSTMAN merupakan aplikasi chrome. Oleh karena itu Anda harus memasang chrome terlebih dahulu, kemudian memasang ekstensi POSTMAN di dalam chrome
  • Silex, Anda dapat mengunduh Silex di website resminya kemudian pilih paket yang diinginkan
  • Silex Official Documentation, tutorial ini hanya pengantar saja, untuk melihat cara dan teknik lengkapnya, Anda harus mengunduh official documentation Silex.

Membuat kode REST di file index.php

Agar fokus dengan implementasi REST, kita akan menggunakan database mytrip yang ada di artikel PDKT dengan MongoDB. Kita akan menggunakan function bawaan PHP untuk MongoDB. Setelah kita unduh Silex, ekstrak bundelan tersebut kemudian beri nama dengan mytrip dan letakkan di dalam folder publik dari Apache (misal: htdocs atau /var/www/html):

Kemudian kita edit index.php dan kita akan melihat sebuah kode awal yang terdapat di Silex.

<?php

require_once __DIR__.'/../vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;

$app = new Silex\Application();

$app->get('/hello', function () {
    return 'Hello!';
});

Di dalam kode tersebut, terdapat pemanggilan library yang ada di dalam folder vendors dengan memanggil autoload.php. Kemudian kita menggunakan class Request untuk mengambil setiap nilai yang dikirimkan oleh client. Kemudian kita membuat sebuah objek Silex dengan menginstansiasi Silex melalui function Application(). Setelah itu kita definisikan URL /hello dengan method GET. Anda dapat mencoba memanggil URL /hello dengan POSTMAN. Hasilnya adalah Anda akan melihat POSTMAN menampilkan pesan berupa Hello !.

Sekarang kita akan mendefinisikan URL /trip dengan metode GET yang akan menampilkan semua trip yang terdapat di collection trip:

$app->get('/trip', function () use ($app) {
    $mongo_client = new MongoClient();
    $db = $mongo_client->mytrip;
    $trip = $db->trip;
    $cursor = $trip->find();
    $result = iterator_to_array($cursor);

    $temp_result = array();
    foreach ($result as $key => $val){
        $temp_result[] = $result[$key];
    }

    return $app->json( array ( 'msg' => 'daftar trip berhasil diambil', 'resp'=>$temp_result) );
});

Pada kode diatas, kita tidak memerlukan parameter tambahan oleh karena itu saat menulis closure yang dilewatkan ke dalam function get() tidak melewatkan parameter apapun. Kemudian kita lakukan koneksi ke MongoDB menggunakan MongoClient(). Kemudian memilih database mytrip lalu memanggil collection trip. Setelah itu kita gunakan method find() untuk mendapatkan semua document yang ada pada collection trip.

Hasil query tersebut kita konversi menjadi array karena hasil mentahnya tidak dapat kita tampilkan yang hanya akan membuat aplikasi menjadi error. Setelah menggunakank iterator_to_array(), kita lakukan konversi agar menjadi lebih sesuai dengan format yang akan ditampilkan di halaman client dengan looping foreach() { }. Dan terakhir kita tampilkan hasil query yang disimpan ke dalam sebuah array dengan key resp dan menyertakan juga sebuah pesan dengan key msg. Hasil query ditampilkan ke dalam response berupa JSON dengan method json() yang dimiliki objek Silex $app.

Mari kita lanjutkan dengan mendefinisikan URL /trip/{id} dengan metode GET yang akan menampilkan trip tertentu dengan menggunakan id dari suatu document:

$app->get('/trip/{id}', function ($id)  use ($app){
    $mongo_client = new MongoClient();
    $db = $mongo_client->mytrip;
    $trip = $db->trip;
    $result = $trip->findOne( array("_id" => new MongoId($id)) );

    return $app->json( array ( 'msg' => 'trip berhasil diambil', 'resp'=>$result) );
});

Karena kita membutuhkan parameter, maka di closure kita lewatkan $id yang mereferensi kepada {id} sebaiknya namanya disamakan saja agar tidak membuat Anda pusing. Kemudian kita lakukan koneksi ke MongoClient(), mengambil database mytrip, dan memilih collection trip. Kemudian kita menggunakan method findOne() yang dimiliki objek collection.

Perhatikan pada pemanggilan findOne(), kita tidak dapat langsung menggunakan id document dalam bentuk string. Kita harus mengubahnya terlebih dahulu kedalam bentuk ObjectId yang dilakukan dengan menggunakan MongoId(). Setelah itu kita tampilkan hasil query tanpa melakukan konversi apapun.

Sekarang kita akan mendefinisikan URL /trip dengan metode POST yang akan melakukan proses pembuatan trip baru:

$app->post('/trip', function (Request $request)  use ($app){
    $mongo_client = new MongoClient();
    $db = $mongo_client->mytrip;
    $trip = $db->trip;

    $new_trip = array(
            'name' => $request->request->get('name'),
            'category' => $request->request->get('category'),
            'city' => $request->request->get('city'),
            'description' => $request->request->get('description'),
        );

    $trip->insert($new_trip);

    return $app->json( array ( 'msg' => 'trip berhasil ditambah') );
});

Pada kode diatas kita melewatkan parameter $request dengan tipe data berupa objek Request, karena kita akan mengakses data yang dikirimkan melalui metode POST. Seperti biasa kita melakukan koneksi ke MongoDB dan memilih collection trip. Kemudian kita mengakses data yang dikirimkan melalui metode POST dengan menggunakan $request->$request->get(). Kemudian kita bentuk ke dalam sebuah array, kemudian kita gunakan method insert() untuk membuat document baru.

Sekarang kita akan mendefinisikan URL /trip dengan metode PUT yang akan melakukan proses update terhadap sebuah trip:

$app->put('/trip/{id}', function (Request $request, $id) use ($app) {
    $mongo_client = new MongoClient();
    $db = $mongo_client->mytrip;
    $trip = $db->trip;

    $new_trip = array(
            'name' => $request->request->get('name'),
            'category' => $request->request->get('category'),
            'city' => $request->request->get('city'),
            'description' => $request->request->get('description'),
        );

    $trip->update(array( "_id" => new MongoId($id) ), array( '$set'=>$new_trip ) );

    return $app->json( array ( 'msg' => 'trip berhasil diubah') );
});

Tidak berbeda jauh saat kita membuat kode untuk metode POST. Perbedaan di metode PUT hanya terletak pada parameter id document yang dilewatkan pada proses update ini. Kemudian kita menggunakan method update() dengan melewatkan id document yang akan kita update, kemudian menggunakan operator $set untuk memodifikasi nilai setiap kolom dari document.

Sekarang kita akan mendefinisikan URL /trip/{id} dengan metode DELETE yang akan melakukan proses penghapusan terhadap sebuah trip:

$app->delete('/trip/{id}', function ($id) use ($app) {
    $mongo_client = new MongoClient();
    $db = $mongo_client->mytrip;
    $trip = $db->trip;
    $result = $trip->remove( array("_id" => new MongoId($id)) );

    return $app->json( array ( 'msg' => 'trip berhasil dihapus') );
});

Hampir sama dengan metode GET, hanya saja kita menggunakan method remove() untuk menghapus suatu document. Terakhir kita panggil method run() yang akan menjalankan aplikasi Silex yang telah kita bangun:

$app->run();

Menggunakan POSTMAN untuk Mencoba API

Untuk menggunakan POSTMAN, Anda hanya perlu menunjuk URL apa yang akan diproses, kemudian memilih metode yang akan digunakan (GET, POST, PUT, DELETE, atau lainnya). Kemudian ada beberapa pilihan seperti authorization, membuat custom header, dan membuat request body baik dalam bentuk form-data, x-www-form-urlencoded, raw, atau binary. Untuk metode PUT dan POST kita akan gunakan request body dalam bentuk x-www-form-urlencoded.

Berikut adalah contoh screenshot penggunaan POSTMAN untuk mencoba API yang telah kita bangun menggunakan Silex:

-- Postman saat mencoba URL /hello

Selection_004

-- Postman saat mencoba URL /trip dengan metode GET

Selection_005

-- Postman saat mencoba URL /trip/{id} dengan metode GET

Selection_006

-- Postman saat mencoba URL /trip dengan metode POST

Selection_007

-- Postman saat mencoba URL /trip/{id} dengan metode PUT

Selection_008

-- Postman saat mencoba URL /trip/{id} dengan metode DELETE

Selection_009

Penutup

Dengan mengikuti tutorial ini diharapkan bagi Anda yang belum mengenal REST dapat memulai mengembangkan API untuk aplikasi mobile atau web. Anda pun dapat mulai mempelajari tentang authentication untuk membendung sejumlah pengguna web service yang tidak diizinkan.

REST memang memiliki sejumlah standard. Salah satunya seperti yang terdapat pada REST versi NSA (National Security Agency) atau REST versi W3C.Apakah kita akan mengimplementasikan standard tersebut atau tidak, hal itu dikembalikan kembali kepada kesepakatan tim pengembang yang memiliki kebijakan masing - masing. Bahkan di tutorial ini saja status code yang digunakan hanya 200 saja.

Mungkin di lapangan ada yang membuat web service dengan keharusan mengirimkan data berupa JSON, ada juga yang berupa data POST biasa, ada juga yang XML. Bahkan ada juga yang hanya mengimplementasikan metode GET dan POST saja. Hal yang paling penting adalah apakah menciptakan API yang mudah digunakan atau justru sulit digunakan bagi penggunanya.

Referensi

  • The Silex Book
  • Restful Service Best Practices - RestApiTutorial.Com
  • MongoDB Official Documentation
(codepolitanteam)