[Silex Framework] Make REST Web Service (2)

Melanjutkan postingan sebelumnya pada tautan https://sabitlabscode.wordpress.com/2016/05/07/silex-framework-make-rest-web-service-1/, kali ini saya akan memaparkan bagaimana membuat API untuk POST, PUT dan DELETE method (pada postingan sebelumnya telah dibahas API untuk GET method).

Apa sih beda antara GET, POST, PUT dan DELETE method ?

Penjelasan lengkapnya ada di https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html. Kalo males baca disana, singkatnya GET digunakan untuk operasi yang tidak merubah database/sistem, biasanya cuma nampilin data(view data detail, melihat list data, search, dll). Kalo POST digunakan untuk operasi yang merubah data (misal insert data baru ke dalam database server). Sedangkan PUT mirip dengan POST, tetapi PUT biasanya menyimpan informasi spesifik dari suatu data (misal kita ingin membuat operasi update data, kita biasanya punya info “id” data yang akan di update). Sedangkan DELETE dari namanya udah kelihatan biasa digunakan untuk operasi melakukan delete data, pada umumnya dia merubah data tetapi tidak melempar parameter ke dalam fungsi seperti POST dan PUT.

Sebelum melanjutkan project ini, siapa tahu nanti ada yang ga sukses mengikuti tutorial disni, anda dapat download code akhir dari project ini pada tautan berikut  https://github.com/sabithuraira/tutor_silex.  Sebelum lanjut perlu saya beritahukan bahwa nama tabel yang sebelumnya “menu_makanan” saya rubah menjadi “food_list”. Kemudian nama field pada tabel yang sebelumnya “nama” dan “harga”, saya rubah menjadi “name” dan “price”. Kok di rubah? biar orang yg ga ngerti bahasa Indonesia juga ngerti baca code dari github tadi.

Okey, sekarang mari kita lanjutkan…

Kita akan membuat sebuah perintah untuk insert data baru, masukkan code berikut :

//kita menggunakan POST
$app->post('/insert', function (Silex\Application $app, Request $request) {
    //mendefinisikan data "food_list" yang akan ditambahkan
    $data=array(
      'name' => $request->get('name'), 
      'price' => $request->get('price'),
    );

    //perintah insert data baru ke dalam tabel "food_list" dengan data yang
    //sudah dideklarasikan
    $app['db']->insert('food_list', $data);

     return $app->json("Success save data");
});

Pada code di atas terdapat petikan code “$request->get(‘name’)” maksud dari kode tersebut adalah bahwa fungsi akan mengambil sebuah nilai yang dilempar oleh client service dengan nama “name”. Misal kalo suatu saat anda membuat sebuah aplikasi android untuk insert data melalui API ini, maka aplikasi android anda harus melempar nilai bernama “name” dan “price”. Server akan menangkap kedua nilai tersebut untuk diolah kemudian.

Setelah proses insert data, sekarang kita akan membuat proses update data. Masukkan kode berikut :

$app->put('/update/{id}', function (Silex\Application $app, Request $request,$id) {
    //definisi data, sama dengan pada proses insert
    //nilai-nilai dari data diambil dari variabel yg dikirimkan oleh 
    //aplikasi client (dari aplikasi android pada penjelasan di atas)
    $data=array(
      'name' => $request->get('name'),
      'price' => $request->get('price'),
    );

     //perintah untuk melakukan update data pada tabel food_list,
     //dengan data yg sudah di masukkan dan yg di update data dengan id tertentu
     $app['db']->update('food_list', $data,array('id'=>$id));
     return $app->json("Success update data");
});

Code di atas adalah kode untuk melakukan update data melalui API, sebenarnya mirip dengan proses insert hanya saja kali ini kita memiliki informasi id dari data yang ingin diupdate.

Kemudian untuk proses delete data, masukkan kode berikut :

$app->delete(‘/delete/{id}’, function (Silex\Application $app, Request $request,$id) {
//perintah untuk menghapus data pada tabel “food_list” dengan id tertentu

$app[‘db’]->delete(‘food_list’, array(‘id’=>$id));
return $app->json(“Success delete data”);
});

Kode di atas lebih simpel karena hanya melempar suatu id kemudian menghapus data dengan id tersebut.

Dengan membuat fungsi untuk menghapus, maka kita sudah membuat contoh penerapan perintah dasar pada Rest API yaitu GET, POST, PUT dan DELETE. Kita juga sudah melihat contoh sederhana untuk melakukan operasi CRUD pada sebuah tabel. Sekarang masalahnya mungkin temen-temen merasa tidak bisa melakukan testing langsung output dari aplikasi yang kita buat. Ya, untuk dapat melihat secara langsung output dari aplikasi yang telah kita buat kita harus membuat langsung aplikasi client untuk mengkonsumsi REST API yang kita buat. Anda bisa membuat dengan aplikasi apapun, desktop app, mobile app, web app.. anda juga bebas menggunakan bahasa pemrograman apapun mau pake PHP, Java, C#, dll..

Gimana cara buat aplikasi client nya? Memang anda harus belajar lebih lanjut untuk memahami bagaimana cara membuat aplikasi clientnya. Pada postingan selanjutnya saya akan memaparkan tutorial membuat aplikasi client berbasis Android dengan Xamarin untuk mengkonsumsi REST API yang sudah kita buat pada postingan ini..

Selamat mencoba, happy coding 😀

 

[Silex Framework] Make REST Web Service (1)

Okey, setelah kurang lebih 5 bulan nggak posting di blog ini, akhirnya dikasih waktu dan kesempatan kembali untuk membuat catatan disini. Kali ini saya akan menjabarkan cara membuat REST Web Service dengan menggunakan Silex Framework, kalo ada yang belum tahu tentang silex framework bisa dilihat di http://silex.sensiolabs.org/. Bisa dilihat pada webnya silex adalah “The PHP micro framework based on Symfony2 Components”, jadi komponen yang digunakan oleh Silex adalah dari Symfony2 yang dari kematangan sudah teruji dalam development aplikasi website. Terus kalo ga ngerti Symfony2 gimana? buat yang ga familiar dengan symfony2 tetap bisa pake kok (saya juga ga familiar dgn Symfony2).

Kenapa pake Silex? kenapa ga pake framework lain macam Yii, Laravel atau Symfony2 sekalian?. Saya ingin membuat sebuah sistem terpisah yang bertugas cuma untuk menangani web service saya. Jika menggunakan framework seperti Yii, Laravel atau symfony2 saya rasa terlalu kompleks dan ditakutkan mempengaruhi performance dari web service yang saya bangun. Pada tutorial selanjutnya mungkin saya akan posting cara mengkonsumsi web service yang kita buat dengan Android atau Xamarin.

Laravel juga punya micro framework yang namanya Lumen, kenapa ga pake itu? Hmm, keputusan pribadi sih. Setelah googling sana-sini, walau banyak perbedaan pendapat antar developer mana yang lebih baik, saya menetapkan dan lebih tertarik explore si Silex.

Pada tutorial ini saya ingin membuat sebuah API Web Service yang dapat mengeluarkan dan mengelola data daftar makanan+harganya. Pertama-tama mari buat sebuah database dan buatlah sebuah tabel berikut :

CREATE TABLE `menu_makanan` (
 `id` INT NOT NULL AUTO_INCREMENT ,
 `nama` VARCHAR(255) NULL ,
 `harga` DECIMAL(12,0) NULL ,
 PRIMARY KEY (`id`) );

Setelah itu inputlah beberapa contoh data, misal seperti gambar berikut :

Capture

Setelah selesai dengan database, sekarang donlot Silex Framework di http://silex.sensiolabs.org/download. Yang di download lebih baik yang “slim”. Ektrak file tersebut dan masukkan ke dalam web server anda (folder letak localhost anda). Rubah nama folder “silex” anda dengan nama project yang anda inginkan (saya memberi nama project dengan “tutor_silex”). Jangan lupa install composer, download di https://getcomposer.org/. Ini dapat digunakan untuk memudahkan anda mengupdate komponen2 pada aplikasi anda secara online melalui command composer.

Buka aplikasi hello world anda pada tautan berikut : http://localhost/tutor_silex/web/index.php/hello. Akan terlihat tampilan browser dengan tulisan “Hello!”.

Sekarang pada project anda silahkan buka file pada “web/index.php”. Berikut penjelasan kode pada file tersebut :

<?php
//kode ini mendefinisikan file pada vendor/autoload.php, 
//file ini adalah sumber induk untuk mengkonsumsi components pada silex/symfony2 component.
require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();

//router "hello", mendefinisikan sebuah router yang dapat dipanggil browser
//pada contoh sebelumnya kita telah memanggil tautan yang menampilkan tulisan "Hello!"
//disinilah kode yang mengeksekusi hal tersebut.
$app->get('/hello', function () {
 return 'Hello!';
});

$app->run();

Kita akan menghubungkan aplikasi kita dengan database yang telah kita buat. Untuk mengubungkan aplikasi dengan database kita akan menggunakan doctrine dalam hal ini kita harus melakukan setting pada file “composer.json” yang ada pada aplikasi dan masukkan kode berikut :

{
  "require": {
     "silex/silex": "~1.1",
     "doctrine/dbal":"~2.2",
     "phpunit/phpunit": "4.5.*"
  }
}

Pada code di atas kita mendefinisikan doctrine dan phpunit agar dapat menghubungkan aplikasi dengan database. Doctrine dan phpunit saat ini belum ada pada aplikasi anda, untuk itu kita harus mengupdate komponen anda dengan menggunakan composer. Buka command prompt anda, cd (change direktori) ke direktori project anda. Kemudian update komponen anda dengan mengetikkan perintah “composer update” pada cmd anda. Tunggu hingga proses selesai.

Setelah selesai masukkan kode berikut pada web/index.php anda :

<?php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();

//mendefinisikan koneksi ke database
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
   'db.options' => array(
      'driver' => 'pdo_mysql',
      'host' => 'localhost',
      'dbname' => 'test',
      'user' => 'root',
      'password' => '',
    ),
));

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

//route untuk menampilkan daftar semua makanan pada database
$app->get('/daftar', function (Silex\Application $app,Request $request)
{
   $result=array();
   //query database
   $sql = "SELECT * FROM menu_makanan";
   $stmt=$app['db']->query($sql);
   while($row=$stmt->fetch()){
       //format data yang akan ditampilkan
       $result[]=array(
          'id' =>$row['id'],
          'nama' =>$row['nama'],
          'harga' =>$row['harga'],
       );
    }
 
    return $app->json($result);
});

//route untuk menampilkan data makanan dengan id tertentu pada database
$app->get('/daftar/{id}', function (Silex\Application $app,Request $request,$id)
{
   $result=array();
   $sql = "SELECT * FROM menu_makanan WHERE id={$id}";

   $stmt=$app['db']->query($sql);
   while($row=$stmt->fetch()){
       $result[]=array(
           'id' =>$row['id'],
           'nama' =>$row['nama'],
           'harga' =>$row['harga'],
        );
    }
 
    return $app->json($result);
});

$app->run();

Buka browser anda, kemudian buka tautan “http://localhost/tutor_silex/web/index.php/daftar&#8221;, akan tampil data dalam format json seperti berikut :

[{"id":"1","nama":"Pempek Kapal Selam","harga":"10000"},
{"id":"2","nama":"Gado-gado","harga":"10000"},
{"id":"3","nama":"Nasi Uduk","harga":"7000"}]

Kemudian buka tautan “http://localhost/tutor_silex/web/index.php/daftar/2&#8221; (kita memberikan id spesifik dari data yang ingin ditampilkan) akan muncul data dengan format seperti berikut :

[{"id":"2","nama":"Gado-gado","harga":"10000"}]

Anda dapat mengkonsumsi API tersebut. Bisa menggunakan berbagai jenis platfom seperti android, PHP, Iphone, Windows Phone, dll..

Terus kalo mau buat operasi insert/update data sama delete, gimana caranya pake REST Web Service? Hmm, berhubung lagi capek ngetik, maka postingan untuk insert/update dan delete akan saya lanjutkan pada postingan selanjutnya.. terima kasih..

Happy coding 😀