dengan PHP
Daftar Isi
• Langkah 0: Konsep Dasar
• Langkah 1: Database
• Langkah 2: Pustaka (Library)
• Langkah 3: Titik Ujung (End-Point)
• Langkah 4: Pasang dan Uji (Deploy & Test)
• Tambahan: Keamanan dan Pernik Penting
• Penutup: Selanjutnya apa?
1
Apa itu API?
API merupakan singkatan dari Application Programming Interface, dan itu pasti bukan nama
warung atau brand mie ayam atau kuliner lain. Wikipedia yang sudah tua dan bagus
mendefinisikannya sebagai:
Seperangkat metode komunikasi antara berbagai komponen yang didefinisikan dengan jelas.
Agak samar, tapi itu cukup menjelaskan apa itu API. Di Internet modern, sistem berbasis web
kemungkinan besar harus berkomunikasi dengan situs web, aplikasi Android, aplikasi iOS, dan
mungkin bahkan sistem pihak ketiga lainnya. Antarmuka yang menangani semua komunikasi
adalah API.
Misalnya, Kita menjalankan toko online dan ingin mengembangkan aplikasi Android / iOS
untuk itu. Akan agak bodoh (dan hardcore) untuk mengembangkan 3 set kode yang berbeda
untuk menangani setiap platform, dan karena itulah, kita lebih baik memiliki satu "standar" API
untuk memproses semua pendaftaran pengguna, katalog produk, checkout, dan manajemen
pesanan.
Catatan:
Kita kadang kala memanggil “web service” atau “endpoint” API. Tidak perlu bingung,
keduanya mempunyai makna yang sama, menunjukkan hal yang sama.
REST adalah singkatan dari Representational State Transfer. Dari Wikipedia lama yang baik
lagi:
REST adalah gaya arsitektur yang mendefinisikan serangkaian batasan yang akan digunakan
untuk membuat layanan web. Layanan Web yang sesuai dengan gaya arsitektur REST, atau
layanan web RESTful, menyediakan interoperabilitas antara sistem komputer di Internet.
Layanan web yang sesuai dengan REST memungkinkan sistem yang meminta untuk
mengakses dan memanipulasi representasi tekstual dari sumber daya web dengan
menggunakan serangkaian operasi stateless yang seragam dan telah ditentukan sebelumnya.
Kelihatannya seperti beberapa hal teknis yang membingungkan, tetapi mari kita pisahkan
sedikit demi sedikit. REST pada dasarnya adalah ide di balik apa yang sudah ada di Internet:
situs web. Dalam arsitektur REST apa pun, harus ada:
• Suatu hubungan client/server.
• Protokol stateless (seperti HTTP).
• Protokol berlapis (misal TCP/IP).
2
RESTful API
Jadi ketika kita menggabungkan kekuatan REST dan API bersama-sama, diperolehlah API
yang mendukung REST (disebut sebagai RESTful API):
• API harus "menyediakan interoperabilitas antara sistem komputer di Internet". Artinya,
API harus dapat menangani proses di situs web, aplikasi Android, aplikasi iOS, dan
sistem lainnya.
• Mengijinkan sistem yang meminta mengakses dan memanipulasi representasi tekstual
dari sumber daya web. Ketika klien membuat permintaan ke server, server harus
mengembalikan respons tekstual.
• Kumpulan operasi tanpa status yang telah ditentukan. API hanya memiliki seperangkat
fungsi tetap, dan itu tidak seperti baris perintah di mana Kita dapat melakukan apa pun
yang diinginkan. Operasi stateless artinya, setelah server merespons, koneksi ditutup.
CRUD
Berbicara tentang seperangkat fungsi tetap yang telah ditentukan, Kita juga harus tahu CRUD:
• Create (membuat)
• Read (membaca)
• Update (mengupdate)
• Delete (menghapus)
Yap, konsep CRUD sederhana tetapi tetap berlaku untuk hampir semua proses dan API yang
dibuat. Sebagai contoh:
• Membuat suatu pengguna baru (C).
• Membaca data pengguna tersebut (R).
• Mengupdate pengguna tersebut (U).
• Menghapus pengguna tersebut (D).
Jadi untuk sistem apa pun yang sedang dikerjakan, perlu diingat bahwa CRUD adalah 4 proses
dasar pertama yang harus dicakup sistem tersebut.
Langkah 1: Database
Mari kita mulai dengan meletakkan dasar-dasarnya terlebih dahulu. Kita akan membuat tabel
users sebagai contoh (dummy) untuk tujuan demonstrasi dalam tutorial ini. Ada di antara Kita
mungkin sudah memiliki proyek dan mungkin ingin mengerjakannya. Tetapi sangat
direkomendasikan untuk bereksperimen dengan tabel dummy ini terlebih dahulu, memahami
mekanisme di belakangnya dengan baik sebelum benar-benar mengimplementasikan ke dalam
suatu proyek nyata.
3
Tabel
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Field Deskripsi
email Alamat email dari user, Atur seunik mungkin untuk menghindari registrasi
double
Data Contoh
Sekarang untuk beberapa data tiruan, kata sandi semua pengguna di sini adalah "test123",
dienkripsi dengan PHP openssl_encrypt dan kunci rahasia "CodeB0xx".
4
(11, 'Frank Doe', 'frank@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(12, 'Gina Doe', 'gina@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(13, 'Hela Doe', 'hela@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(14, 'Hubert Doe', 'hubert@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(15, 'Ivy Doe', 'ivy@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(16, 'Ingrid Doe', 'ingrid@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(17, 'James Doe', 'james@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(18, 'Jace Doe', 'jace@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(19, 'Kate Doe', 'kate@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(20, 'Luke Doe', 'luke@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg==');
Langkah 2: Pustaka
Setelah membuat dasarnya, sekarang saatnya untuk membangun pustaka pengguna. Ya, Kita
dapat "secara langsung mengkodekan" segala sesuatu menjadi satu skrip, tapi akan lebih
menguntungkan jika mempertahankannya sebagai praktik pemrograman yang baik - Ingat
kegunaan dan perawatan yang mudah di sini.
Misalnya, basis data pengguna yang dipakai di situs web eCommerce. Ada etalase toko, admin
backend, dan API untuk mendukung aplikasi seluler (mobile). Jika kita menulis "satu skrip
untuk masing-masing", maka kita akan memiliki 3 set skrip terpisah untuk melakukan hal yang
sama. Tetapi begitu itu diletakkan semuanya di dalam suatu pustaka, kita dapat
menggunakannya di berbagai platform yang berbeda, kita hanya memiliki satu library yang
harus dipelihara:
lib_user.php
<?php
class User{
private $pdo = null;
private $stmt = null;
public $error = "";
/* [THE BASICS] */
function __construct(){
try {
$this->pdo = new PDO(
"mysql:host=".MYSQL_HOST.";dbname=".MYSQL_DB.";charset=".MYSQL_CHAR,
MYSQL_USER, MYSQL_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]
5
);
} catch (Exception $ex) { die($ex->getMessage()); }
}
function __destruct(){
if ($this->stmt!==null) { $this->stmt = null; }
if ($this->pdo!==null) { $this->pdo = null; }
}
/* [GET USERS] */
function getAll(){
$this->stmt = $this->pdo->prepare("SELECT * FROM `users`");
$this->stmt->execute();
$users = $this->stmt->fetchAll();
return count($users)==0 ? false : $users;
}
function getEmail($email){
$this->stmt = $this->pdo->prepare("SELECT * FROM `users` WHERE `email`=?");
$cond = [$email];
$this->stmt->execute($cond);
$user = $this->stmt->fetchAll();
return count($user)==0 ? false : $user[0];
}
function getID($id){
$this->stmt = $this->pdo->prepare("SELECT * FROM `users` WHERE `id`=?");
6
$cond = [$id];
$this->stmt->execute($cond);
$user = $this->stmt->fetchAll();
return count($user)==0 ? false : $user[0];
}
function delete($id){
return $this->query(
"DELETE FROM `users` WHERE `id`=?",
[$id]
);
}
/* [LOGIN] */
function login($email, $password){
$user = $this->getEmail($email);
if ($user==false) { return false; }
return openssl_decrypt($user['password'],
"AES-128-ECB", SECRET_KEY) == $password ? $user : false ;
7
}
}
?>
Ingat CRUD? Saat membangun pustaka, harus memiliki fungsi untuk mengakomodir semua
itu.
Dasar
Fungsi Deskripsi
Get (READ)
Fungsi Deskripsi
Fungsi Deskripsi
Login
Fungsi Deskripsi
LOGIN Memeriksa apakah email dan kata sandi yang diberikan BENAR, mengembalikan
false jika tidak, mengembalikan data pengguna jika YA. Perhatikan, ini hanya
memeriksa dan tidak memulai sesi cookie.
8
Langkah 3: Titik Ujung
Kita sekarang telah meletakkan semua fondasi yang diperlukan, dan langkah terakhir adalah
membangun API atau titik akhir yang sebenarnya. Ini seharusnya mudah selama kita telah
memiliki fungsi dalam pustaka dengan benar.
File Konfigurasi
user-endpoint.php
<?php
// INIT
session_start();
error_reporting(E_ALL & ~E_NOTICE);
require "config.php";
require "lib_user.php";
$users = new User();
// PROCESS REQUEST
header('Content-Type: application/json');
if (isset($_POST['req'])) { switch ($_POST['req']) {
default:
echo json_encode([
"status" => false,
"message" => "Invalid Request"
]);
9
break;
case "get-all":
$all = $users->getAll();
echo json_encode([
"status" => $all==false?false:true,
"data" => $all
]);
break;
case "get-email":
$usr = $users->getEmail($_POST['email']);
echo json_encode([
"status" => $all==false?false:true,
"data" => $usr
]);
break;
case "get-id":
$usr = $users->getID($_POST['id']);
echo json_encode([
"status" => $all==false?false:true,
"data" => $usr
]);
break;
case "create":
$pass = $users->create($_POST['name'], $_POST['email'], $_POST['password']);
echo json_encode([
"status" => $pass,
"message" => $pass ? "User Created" : "Error creating user"
]);
break;
case "update":
$pass = $users->update($_POST['name'], $_POST['email'], $_POST['password'],
$_POST['id']);
echo json_encode([
"status" => $pass,
"message" => $pass ? "User Updated" : "Error updating user"
10
]);
break;
case "delete":
$pass = $users->delete($_POST['id']);
echo json_encode([
"status" => $pass,
"message" => $pass ? "User Deleted" : "Error deleting user"
]);
break;
case "login":
if (is_array($_SESSION['user'])) {
die(json_encode([
"status" => true,
"message" => "Already signed in"
]));
}
$pass = $users->login($_POST['name'], $_POST['password']);
if ($pass!==false) { $_SESSION['user'] = $pass; }
echo json_encode([
"status" => is_array($pass),
"message" => is_array($pass) ? "OK" : "Error"
]);
break;
case "logoff":
unset($_SESSION['user']);
echo json_encode([
"status" => true,
"message" => "OK"
]);
break;
}}
?>
11
Kita dapat membayangkan titik akhir hanya sebagai sepotong kue ketika library telah dibangun
dengan benar. Tetapi bagaimana keseluruhan API end-point berfungsi di sini?
• Request API akan dipost-kan ke file user-endpoint.php.
• Semua permintaan akan berisi variabel "req" untuk menyatakan fungsi yang diperlukan,
diikuti oleh parameter yang diperlukan. Misalnya, jika ingin mendapatkan pengguna
melalui email maka kita harus memposting req = get-email dan email=john@doe.com
ke titik akhir pengguna ini.
• Sistem akan memberikan respons dalam format JSON. Programmer biasanya suka
menyimpan format standar agar respons tidak membingungkan pihak ketiga mana pun
yang menggunakan API. Sebagai contoh:
DATA Berisi data yang diminta, misalnya, ini akan menampung daftar
pengguna yang dicari.
12
Email <input type="email" name="email" required/><br>
<input type="submit" value="Get"/>
</form>
<h1>Update</h1>
<form action="user-endpoint.php" method="post" target="_blank">
Request <input type="text" name="req" value="update" readonly/><br>
ID <input type="text" name="id" required/><br>
Name <input type="text" name="name" required/><br>
Email <input type="email" name="email" required/><br>
Password <input type="text" name="password"/><br>
<input type="submit" value="Update"/>
</form>
<h1>Delete</h1>
<form action="user-endpoint.php" method="post" target="_blank">
Request <input type="text" name="req" value="delete" readonly/><br>
ID <input type="text" name="id" required/>
<input type="submit" value="Delete"/>
</form>
</body>
</html>
13
Ada banyak cara dalam menguji API. Kode HTML sederhana di atas salah satunya. Cara lain
adalah menggunakan tool khusus di Google Chrome atau Firefox. Membuat program dengan
PHP cURL, atau pemanggilan API melalui Javascript juga dapat diberlakukan. Untuk pemula
yang masih bingung dengan apa yang dilakukan 3 langkah sebelumnya, tes sederhana dengan
HTML ini akan menunjukkan dengan tepat bagaimana keseluruhan API bekerja. Misalnya, jika
kita ingin membuat pengguna baru maka yang harus dilakukan adalah memposting variabel
yang diperlukan ke user-endpoint.php.
Req Create
NAME uvuwewewe
EMAIL uvuwewewe@onyetenyevwe.com
PASSWORD test12345
Jika prosesnya berhasil maka harus diperoleh respons dari server berupa:
{"status":true,"message":"User Created"}
Tentu saja, di dunia aplikasi web dan seluler profesional, itu seharusnya merupakan panggilan
AJAX dan kita perlu mendekode JSON hasilnya untuk menunjukkannya dengan benar di
antarmuka pengguna.
Sebagai langkah opsional akhir dalam penyebaran - Jika menggunakan nama file mentah
endpoint-user.php membuat sistem merasa terancam, maka kita dapat menggunakan penulisan
ulang URL dalam file .htaccess sekaligus membuat URL menjadi lebih ramah. Misalnya, kita
dapat mengarahkan https://yoursite.com/api/users/ ke skrip endpoint pengguna:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^api/users/?$ /endpoint-user.php [L]
</IfModule>
Sangat disarankan melakukannya, karena dengan cara ini, kita juga dapat menggunakannya
untuk mengelola berbagai versi API di masa depan:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^api/users/?$ /endpoint-user-new.php [L]
RewriteRule ^api/users/1.3/?$ /endpoint-user-old.php [L]
</IfModule>
14
Tambahan: Keamanan dan Pernik
Kita sekarang telah berhasil menyelesaikan titik akhir API yang sepenuhnya menendang dan
berfungsi. Tetapi harap perhatikan bahwa titik akhir ini dijaga dengan sangat sederhana untuk
tujuan demonstrasi - Ini bukan bagaimana para profesional akan melakukannya. Banyak hal
telah ditinggalkan, seperti pemeriksaan keamanan dan hal-hal yang harus diterapkan dalam
proyek nyata. Apa saja beberapa “keamanan dan komponen” yang hilang dari contoh di atas?
Inilah beberapa di antaranya.
Demo di atas akan menerima apa pun yang diposting pada form. Ini tentu bukan ide yang baik
dalam sistem produksi, dan kita perlu melakukan beberapa pemeriksaan input. Misalnya, nama
yang valid harus memiliki setidaknya 2 karakter, alamat email yang valid, dan cek terhadap
injeksi SQL.
Perijinan Pengguna
Dengan contoh di atas, siapa pun dapat membuat dan menghapus pengguna. Itu seharusnya
merupakan fungsi "admin saja", dan kita perlu mengimplementasikan beberapa pemeriksaan
ijin pengguna di proyek nyata.
HTTPS
Apa gunanya kata sandi saat kita mengirimkannya di Internet dalam bentuk teks biasa?
Terapkan HTTPS, dan beberapa perusahaan hosting hari ini bahkan memberikan sertifikat SSL
secara gratis.
Dengan segala cara, JSON bukanlah "output standar tetap" dari API. Kita menggunakannya
hanya karena itu adalah salah satu standar yang paling umum digunakan. Jika perlu dukungan
XML, silakan lanjutkan dan belajar mandiri.
Token CSRF
Sama seperti formulir HTML tradisional, API Web juga rentan terhadap serangan CSRF. Apa
itu CSRF dan bagaimana kita mencegahnya? Baca panduannya di:
https://code-boxx.com/simple-csrf-token-php/
15
Rangkuman
• Letakkan fondasi, rancang basis data Anda.
• Buatkan pustaka: Ingatlah bahwa perpustakaan yang baik harus mencakup CRUD.
• Kerjakan API: Ini mudah setelah kita memiliki library yang bagus.
• Pasang dan Uji: Kirimkan request ke setiap end-point dari API.
Klik di sini untuk mengunduh contoh di atas (free). Silakan membangun di atasnya atau
menggunakannya dalam proyek Anda.
16