Metode RESTful API adalah salah satu arsitektur yang umum digunakan oleh programmer sebagai media perantara pertukaran informasi dan data antara aplikasi, baik dalam platform yang sama maupun berbeda. Saat ini, ada banyak framework yang support untuk membuat atau mengembangkan RESTful API. Salah satunya adalah framework Codeigniter.
Pada artikel sebelumnya, gua udah pernah sharing ke kalian mengenai Membuat RESTful API Method POST Tanpa Authentication di Codeignier3 Pada artikel ini, gua akan mencoba share ke kalian bagaimana cara membuat endpoint RESTful API method GET dengan menggunakan framework Codeiginiter 3.
Oke, sebelum lanjut ke proses koding, gua mau coba jelasin dulu batasan-batasan yang mungkin tidak dijelaskan pada artikel ini.
1. Menggunakan framework Codeigniter 3 serta MySQL untuk databasenya
2. Untuk arsitektur RESTful API menggunakan Library codeigniter-restserver yang dikembangkan oleh Chriskaserguis yang diinstall melalui composer (pastikan kalian sudah install aplikasi composer di PC kalian dan asumsi gua, kalian sudah memahami menegnai composer ini ya). Untuk resource library ini bisa kalian akses repo git nya di sini
3. Gua menggunakan vhost pada Windows saat running aplikasi RESTful ini. Jadi, gua saat running aplikasi RESTful ini di browser, tidak menggunakan localhost/folder_projek/controller/method melainkan gua menggunakan subdomain vhost dengan nama api.develop.id
4. Hanya membuat endpoint dengan method GET untuk mendapatkan data dari database dengan parameter limit dan offset
5. Seperti judulnya, pada artikel ini belum menerapkan proses authentication user pada saat user mengakses endpoint RESTful API ini. Jadi, masih menggunakan config RESTful API secara default
6. Database, table, table field dan data yang digunakan hanya data dummy. Silahkan nanti kalian sesuaikan dengan studi kasus kalian ya..
Lanjut, silahkan buat database pada lokal server kalian. Jika kalian ingin menggunakan database yang sudah ada di lokal server kalian, silahkan buat table baru dengan nama table "buku" dan isikan data dummy nya, atau bisa insert lewat method POST sesuai dengan artikel yang gua buat sebelumnya tentang RESTful method POST. Atau supaya lebih cepat, jalankan syntax SQL dibawah ini di dalam database kalian untuk buat table dan insert data dummy-nya.
CREATE TABLE `buku` (
`id` int(11) NOT NULL,
`judul` varchar(255) NOT NULL,
`penulis` varchar(200) NOT NULL,
`penerbit` varchar(200) NOT NULL,
`tgl_terbit` date NOT NULL,
`jml_halaman` int(11) DEFAULT NULL,
`isbn` varchar(100) DEFAULT NULL,
`tgl_ditambahkan` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
--
-- Dumping data for table `buku`
--
INSERT INTO `buku` (`id`, `judul`, `penulis`, `penerbit`, `tgl_terbit`, `jml_halaman`, `isbn`, `tgl_ditambahkan`) VALUES
(2, 'Pemrograman Scratch untuk Pemula', 'Ani Ismayani', 'Elex Media Komputindo', '2023-02-16', 224, '9786230046094', '2023-02-18 00:00:00'),
(3, 'Pengolahan Sinyal Digital', 'DR. IR. SUWADI, M.T.', 'Pt. Refika Aditama', '2021-01-25', 216, '9786237060772', '2023-02-20 00:00:00'),
(4, 'Mudah Membuat Game Dan Animasi Dengan Visual C# .NET, From Beginner To Master', 'Vivian Siahaan & R.H. Sianipar', 'Penerbit Andi', '2023-02-22', 578, '9786230131233', '2023-02-25 00:00:00');
Jika database sudah siap, silahkan download framework Codeigniter 3 di website resminya. Disini gua menggunakan versi terbaru dari Codeigniter 3. Silahkan lakukan config dasar Codeigniter 3 sampai folder projek Codeigniter tersebut bisa diakses melalui browser.
Jika sudah bisa diakses lewat browser, buka file composer.json yang ada didalam projek Codeigniter 3 kalian, misal nama projeknya “api.dev”, berarti file composer.json ada di api.dev/composer.json. Pada tahap ini, kita akan mencoba download package codeigniter-restserver melalui composer. Silahkan tambahkan "chriskacerguis/codeigniter-restserver": "^3.1" (pakai tanda kutip) pada bagian require. Atau silahkan copas syntax ini ke file composer.json kalian.
{
"description": "The CodeIgniter framework",
"name": "codeigniter/framework",
"type": "project",
"homepage": "https://codeigniter.com",
"license": "MIT",
"support": {
"forum": "http://forum.codeigniter.com/",
"wiki": "https://github.com/bcit-ci/CodeIgniter/wiki",
"slack": "https://codeigniterchat.slack.com",
"source": "https://github.com/bcit-ci/CodeIgniter"
},
"require": {
"php": ">=5.3.7",
"chriskacerguis/codeigniter-restserver": "^3.1"
},
"suggest": {
"paragonie/random_compat": "Provides better randomness in PHP 5.x"
},
"scripts": {
"test:coverage": [
"@putenv XDEBUG_MODE=coverage",
"phpunit --color=always --coverage-text --configuration tests/travis/sqlite.phpunit.xml"
],
"post-install-cmd": [
"sed -i s/name{0}/name[0]/ vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStream.php"
],
"post-update-cmd": [
"sed -i s/name{0}/name[0]/ vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStream.php"
]
}
}
Lalu, jalankan command “composer update” melalui CMD dan tunggu sampai proses download package selesai.
Selanjutnya, buka file /aplication/config/config.php projek Codeigniter 3 kalian, cari bagian “$config['composer_autoload'] = ’’;”, lalu ubah menjadi $config['composer_autoload'] = FCPATH . 'vendor/autoload.php';
Jika sudah, copy file /vendor/chriskacerguis/codeigniter-restserver/src/rest.php ke dalam folder /application/config/ pada folder projek kalian. Silahkan lewati tahapan ini jika kalian melanjutkan daripada artikel gua sebelumnya.
Selanjutnya, kita coba untuk membuat atau update file controllers “Book” yang telah kita buat pada artikel sebelumnya. Jika sudah pernah membuat file controllers “Book” pada artikel sebelumnya, silahkan tambahkan fungsi method GET dibawah fungsi method POST yang telah kita buat sebelumnya, atau bisa juga copykan kodingan satu file controllers ini dan paste/replace ke file controllers kalian.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
//perbedaan 1: inisialisasi class RestController
use chriskacerguis\RestServer\RestController;
//perbedaan 2: biasanya class extends ke nama class CI_Controller,
//untuk RESTful API, terutama yang menggunakan package chriskacerguis/RestServer,
//extends ke class RestController
class Book extends RestController {
function __construct()
{
// Construct the parent class
parent::__construct();
// Load model
$this->load->model('book_model');
}
//perbedaan 3: setiap nama fungsi method, diikuti dengan tipe method (GET,POST, DELETE, PUT)
//ex: nama method "add", tipe method POST, jadi nama fungsi nya add_post.
public function list_get()
{
//START : get parameter offset dan limit
//default offset=0 dan limit=10
if (!$this->input->get('limit'))
{
$limit = 10;
}else{
$limit = $this->input->get('limit');
}
if (!$this->input->get('offset'))
{
$offset = 0;
}else{
$offset = $this->input->get('offset');
}
//END : get parameter
//memanggil method get_data di class model untuk query data
$res = $this->book_model->get_data($limit, $offset);
if($res)
{
$this->set_response($res, RestController::HTTP_OK); // SUCCESS GET DATA (201)
return;
}else{
$this->set_response(array(
'status' => FALSE,
'message' => 'Maaf, tidak ada data yang sesuai'
), RestController::HTTP_OK); // REQUEST SUCCESS BUT FAILED TO GET DATA (200)
return;
}
}
}
Disini gua menamakan file atau class controller nya yaitu “Book”. Sebenarnya, ini bebas ya jadi silahkan disesuaikan saja.
Selanjutnya kita buat atau update class models. Disini gua coba memberikan nama class model ini dengan nama “Book_model”. Untuk class models ini, jika kalian sudah pernah membuat class model “Book_model” pada artikel sebelumnya, silahkan tambahkan saja fungsi model di bawah ini.
Atau silahkan copy-kan keseluruhan kodingan class model dibawah ini
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Book_model extends CI_Model{
function __construct(){
parent::__construct();
$this->db = $this->load->database('default',TRUE);
}
function get_data($limit=10, $offset=0)
{
//query select column and table
$this->db->select('*')
->from('buku')
->limit($limit,$offset)
->order_by('id', 'DESC');
//query get data from DB
$query = $this->db->get();
$data['result'] = $query->result_array();
//query for count data according parameter
$this->db->select('*')
->from('buku');
//query get data from DB
$query = $this->db->get();
$data['total_data'] = $query->num_rows();
//return data to controller
return $data;
}
}
Untuk pengujian, disini gua menggunakan aplikasi POSTMAN. Silahkan ketikkan endpoint atau URL API-nya, disini karena gua pakai vhost, maka endpointnya menjadi http://api.develop.id/book/list, dan tipe method nya GET. Secara default, endpoint ini akan mengembalikan data sebanyak maksimal 10 data yang dimulai dari offset ke-0. Jika kalian ingin mengirimkan dan ubah parameter limit dan/atau offset, silahkan ubah endpointnya menjadi http://api.develop.id/book/list?limit=1&offset=2.
Jika sudah, klik tombol SEND untuk mengirimkan request. Dan lihat return API yang diberikan. Jika berhasil, return nya akan seperti ini