Membuat Rest API Service Sederhana dengan PHP Native dan SQLite
Rest API (REST API) adalah antarmuka yang digunakan pengembang perangkat lunak untuk membuat aplikasi yang terhubung ke database dan server back-end.
Rest API memungkinkan untuk berbagi data di beberapa perangkat dan lingkungan. Misalnya, aplikasi mobile dapat menggunakan Rest API untuk mengakses server back-end dan mengambil data untuk ditampilkan di mobile, dengan menggunakan REST API database menjadi tidak mudah untuk terekspos oleh hacker serta dapat mempermudah dalam perawatan program baik dari sisi server maupun client.
Berikut contoh cara mengimplementasikan konsep REST API dalam PHP Native dan SQLLite
1. Membuat database
Pertama kali dalam membuat REST API yaitu kita harus memiliki databasenya terlebih dahulu, disini saya menggunakan konsep OOP untuk membuat REST API
<?php
class Connection {
private $db = "makanguys.db";
public $pdo;
public function __construct() {
try {
$this->pdo = new PDO("sqlite:".__DIR__."\\".$this->db);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//resto
$sql_create1 = "CREATE TABLE IF NOT EXISTS `resto`(
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT,
`name` text NOT NULL,
`image_url` text NOT NULL,
`address` text NOT NULL,
`location` text NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP)";
$this->pdo->exec($sql_create1);
//daftar makanan
$sql_create2 = "CREATE TABLE IF NOT EXISTS `restomenu`(
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT,
`restoid` integer NOT NULL,
`name` text NOT NULL,
`price` integer NOT NULL,
`image_url` text NOT NULL,
`description` text NOT NULL,
FOREIGN KEY (restoid) REFERENCES resto(id)
)";
$this->pdo->exec($sql_create2);
} catch (PDOException $e) {
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
}
?>
Pada kode tersebut jika class tersebut dieksekusi akan menampilkan sebuah file baru jika belum ada yaitu file bernama sesuai dengan isi variable $db “makanguys.db”, fungsi error handling atau “try-catch” pada kode berfungsi untuk menampilkan error jika terdapat masalah dalam pembuatan database.
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Bagian tersebut berfungsi untuk mengatur dua atribut dari PDO:
ERRMODE_EXCEPTION: Ini mengatur error mode PDO untuk mengeluarkan exception saat terjadi masalah pada eksekusi query.
EMULATE_PREPARES: Opsi ini menentukan apakah PDO akan menggunakan query yang sudah disiapkan atau tidak, umumnya disarankan untuk menyetel EMULATE_PREPARES = false dan dengan cara ini, kita dapat membuat query basis data yang lebih efisien dan mencegah kerentanan injeksi SQL.
2. Membuat Fungsi Rest API
Setelah membuat database, kita bisa membuat fungsi untuk REST API, berikut adalah kode saya untuk fungsi yang saya perlukan pada REST API.
public function getAllResto(){
$query = 'select * from resto order by created_at desc';
$stmt = $this->pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data);
}
public function addResto($name,$image_url,$address,$location){
$query = "insert into resto (name,image_url,address,location) values (?,?,?,?)";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$name, $image_url,$address,$location]);
if ($res){
$data = ['name'=>$name, 'image_url'=> $image_url,'address' => $address,'location' => $location];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
public function deleteResto($id){
$query = "delete from resto where id = ?";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$id]);
if ($res){
$data = ['id'=>$id];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
public function getAllMenuResto(){
$query = 'select * from restomenu';
$stmt = $this->pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data);
}
public function getMenuResto($id){
$query = 'select * from restomenu
where restoid = '. $id;
$stmt = $this->pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data);
}
public function addMenuResto($restoid,$name,$price,$image_url,$description){
$query = "insert into restomenu (restoid,name,price,image_url,description) values (?,?,?,?,?)";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$restoid, $name,$price,$image_url,$description]);
if ($res){
$data = ['restoid'=>$restoid,'name'=>$name, 'price'=> $price,'image_url' => $image_url,'description' => $description];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
public function deleteMenuResto($id){
$query = "delete from restomenu where id = ?";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$id]);
if ($res){
$data = ['id'=>$id];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
Fungsi tersebut akan dipanggil jika URL REST API di eksekusi dengan method tertentu, contohnya yaitu method GET,POST,DELETE,PUT,PATCH merupakan method yang paling sering digunakan dalam method REST API.
Berikut merupakan full code dari “koneksi.php”
<?php
class Connection {
private $db = "makanguys.db";
public $pdo;
public function __construct() {
try {
$this->pdo = new PDO("sqlite:".__DIR__."\\".$this->db);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//resto
$sql_create1 = "CREATE TABLE IF NOT EXISTS `resto`(
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT,
`name` text NOT NULL,
`image_url` text NOT NULL,
`address` text NOT NULL,
`location` text NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP)";
$this->pdo->exec($sql_create1);
//daftar makanan
$sql_create2 = "CREATE TABLE IF NOT EXISTS `restomenu`(
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT,
`restoid` integer NOT NULL,
`name` text NOT NULL,
`price` integer NOT NULL,
`image_url` text NOT NULL,
`description` text NOT NULL,
FOREIGN KEY (restoid) REFERENCES resto(id)
)";
$this->pdo->exec($sql_create2);
} catch (PDOException $e) {
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
}
public function getAllResto(){
$query = 'select * from resto order by created_at desc';
$stmt = $this->pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data);
}
public function addResto($name,$image_url,$address,$location){
$query = "insert into resto (name,image_url,address,location) values (?,?,?,?)";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$name, $image_url,$address,$location]);
if ($res){
$data = ['name'=>$name, 'image_url'=> $image_url,'address' => $address,'location' => $location];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
public function deleteResto($id){
$query = "delete from resto where id = ?";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$id]);
if ($res){
$data = ['id'=>$id];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
public function getAllMenuResto(){
$query = 'select * from restomenu';
$stmt = $this->pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data);
}
public function getMenuResto($id){
$query = 'select * from restomenu
where restoid = '. $id;
$stmt = $this->pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data);
}
public function addMenuResto($restoid,$name,$price,$image_url,$description){
$query = "insert into restomenu (restoid,name,price,image_url,description) values (?,?,?,?,?)";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$restoid, $name,$price,$image_url,$description]);
if ($res){
$data = ['restoid'=>$restoid,'name'=>$name, 'price'=> $price,'image_url' => $image_url,'description' => $description];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
public function deleteMenuResto($id){
$query = "delete from restomenu where id = ?";
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute([$id]);
if ($res){
$data = ['id'=>$id];
echo json_encode($data);
} else {
echo json_encode(['error'=>$stmt->errorCode()]);
}
}
}
?>
3. Membuat “resto.php”
Selanjutnya yaitu membuat file dengan nama “resto.php”, disini kita hanya memanggil fungsi yang sudah dibuat pada “koneksi.php” dengan method tertentu, pada tutorial ini REST API yang kita buat belum mengimplementakan autentikasi atau session untuk mengamankan API.
<?php
include 'koneksi.php';
$db = new Connection();
header('Content-Type: application/json');
switch($_SERVER['REQUEST_METHOD']){
case 'GET':
if(isset($_GET['id']))
{
$id = $_GET['id'];
$db->getMenuResto($id);
}
else{
$db->getAllMenuResto();
}
break;
case 'POST':
$restoid = $_POST['restoid'];
$name = $_POST['name'];
$price = $_POST['price'];
$image_url = $_POST['image_url'];
$description = $_POST['description'];
$db->addMenuResto($restoid, $name,$price,$image_url,$description);
break;
case 'DELETE':
$id = $_GET['id'];
$db->deleteMenuResto($id);
break;
default:
break;
}
Pada kode tersebut terdapat 3 Method yang digunakan, pada saat mengeksekusi URL REST API “/menu.php” dengan method GET maka kita akan menampilkan semua data resto yang sudah ada dalam database, jika terdapat parameter misalnya “/menu.php?id=1” maka akan menampilkan satu resto dengan idnya adalah 1.
Kemudian pada method POST tersebut akan digunakan untuk menambahkan resto, kita akan menambahkan data resto pada database dengan mengirimkan HTTP request dengan method POST dan data tersebut dikirim melalui request body bukan melalui URL.
Pada method DELETE disini terdapat fitur untuk menghapus resto berdasarkan ID Resto, untuk menghapus resto kita menggunakan method DELETE dan tambahkan URL Parameter dengan id resto misalnya “delete.php?id=1”.
Berikut tampilannya saat kita mengeksekusi method tersebut melalui Aplikasi Postman
4. Membuat “menu.php”
Pada bagian ini hampir sama dengan bagian ketiga, bagian ini akan digunakan untuk mengatur menu yang terdapat pada resto.
Berikut merupakan kode dari “menu.php”
<?php
include 'koneksi.php';
$db = new Connection();
header('Content-Type: application/json');
switch($_SERVER['REQUEST_METHOD']){
case 'GET':
if(isset($_GET['id']))
{
$id = $_GET['id'];
$db->getMenuResto($id);
}
else{
$db->getAllMenuResto();
}
break;
case 'POST':
$restoid = $_POST['restoid'];
$name = $_POST['name'];
$price = $_POST['price'];
$image_url = $_POST['image_url'];
$description = $_POST['description'];
$db->addMenuResto($restoid, $name,$price,$image_url,$description);
break;
case 'DELETE':
$id = $_GET['id'];
$db->deleteMenuResto($id);
break;
default:
break;
}
Demikian tutorial sederhana untuk membuat REST API dengan PHP Native dan SQLite, Semoga bermanfaat!