Anda di halaman 1dari 16

4 Langkah Mudah Membuat REST API

dengan PHP

Pendahuluan: Mudahnya REST


Selamat datang di tutorial langkah demi langkah mengenai cara membuat REST API sederhana
menggunakan PHP dan MYSQL. Saat ini, orang-orang mengakses Internet dengan berbagai
perangkat yang berbeda: komputer desktop, laptop, tablet, dan smartphone; Teknologi web
modern bukan hanya tentang situs web, Kita juga memiliki aplikasi Android, aplikasi iOS, dan
bahkan kebutuhan untuk komunikasi lintas server aplikasi.
Ini mungkin mengapa Kita mencari cara untuk membuat API, membuat layanan web (web
service) untuk aplikasi seluler atau membuka saluran komunikasi antar server. Itulah yang akan
diperlihatkan secara bertahap oleh panduan ini: konsepnya, contoh sederhana membuat API
PHP untuk mengelola pengguna, dan beberapa informasi tambahan. Baca terus untuk
mengetahui!
Sebuah file zip dengan semua kode sumber juga disertakan di akhir tutorial ini, sehingga kita
tidak perlu meng-copy-paste-kan semuanya ... Atau jika perlu kita dapat langsung
menyelaminya.

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?

Langkah 0: Konsep Dasar


Sebelum kita menyelam ke dalam contoh, bagian ini akan menjelaskan konsep dasar berkaitan
dengan Aplikasi REST API seperti Apa itu API, REST dan CRUD. Bagian ini dapat dilompati
jika dirasa telah memahami dengan baik apa yang dimaksud REST API dan CRUD.

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.

Bagaimana dengan REST?

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;

ALTER TABLE `users`


ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `email` (`email`),
ADD KEY `name` (`name`);

Field Deskripsi

id Primary key, user ID.

name Nama lengkap pengguna.

email Alamat email dari user, Atur seunik mungkin untuk menghindari registrasi
double

password Password dari pengguna (user).

Data Contoh

Sekarang untuk beberapa data tiruan, kata sandi semua pengguna di sini adalah "test123",
dienkripsi dengan PHP openssl_encrypt dan kunci rahasia "CodeB0xx".

INSERT INTO `users` (`id`, `name`, `email`, `password`) VALUES


(1, 'John Doe', 'john@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(2, 'Jane Doe', 'jane@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(3, 'Apple Doe', 'apple@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(4, 'Beck Doe', 'beck@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(5, 'Charlie Doe', 'charlie@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(6, 'Charles Doe', 'charles@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(7, 'Dion Doe', 'dion@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(8, 'Dee Doe', 'dee@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(9, 'Emily Doe', 'emily@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),
(10, 'Ethan Doe', 'ethan@doe.com', 'Xc1HAPhnviO7v6mTfwxsHg=='),

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; }
}

function query($sql, $cond=[]){


try {
$this->stmt = $this->pdo->prepare($sql);
$this->stmt->execute($cond);
} catch (Exception $ex) {
$this->error = $ex->getMessage();
return false;
}
$this->stmt = null;
return true;
}

/* [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];
}

/* [SET & DELETE USERS] */


function create($name, $email, $password){
return $this->query(
"INSERT INTO `users` (`name`, `email`, `password`) VALUES (?,?,?)",
[$name, $email, openssl_encrypt($password, "AES-128-ECB", SECRET_KEY)]
);
}

function update($name, $email, $password="", $id){


$q = "UPDATE `users` SET `name`=?, `email`=?";
$cond = [$name, $email];
if ($password!="") {
$q .= ", `password`=?";
$cond[] = openssl_encrypt($password, "AES-128-ECB", SECRET_KEY);
}
$q .= " WHERE `id`=?";
$cond[] = $id;
return $this->query($q, $cond);
}

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

__CONSTRUCTOR Constructor. Secara otomatis akan terhubung ke


database ketika objek pengguna dibuat.

__DESTRUCT Destructor. Secara otomatis akan menutup koneksi


database ketika objek pengguna dihancurkan.

QUERY Jalankan query SQL yang diberikan pada database.

Get (READ)

Fungsi Deskripsi

GETALL Get all users.

GETEMAIL Get user by the given email address.

GETID Get user by the given user ID.

Set & Delete (CREATE, UPDATE, DELETE)

Fungsi Deskripsi

CREATE Add a new user to the database.

UPDATE Update data of the specified user.

DELETE Delete the given user ID.

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

Sedikit terlewatkan sebelumnya, kita sebaiknya menyimpan semua konfigurasi aplikasi di


dalam satu file tunggal. Lebih mudah dirawat, dan lebih mudah dilindungi. Ingatlah untuk
mengubah pengaturan ini sesuai kebutuhan konfigurasi aplikasi masing-masing.
config.php
<?php
define("MYSQL_HOST", "localhost");
define("MYSQL_DB", "test");
define("MYSQL_CHAR", "utf8");
define("MYSQL_USER", "root");
define("MYSQL_PASS", "");
define("SECRET_KEY", "CodeB0xx");
?>

Skrip Titik Ujung

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:

Variabel Respons Deskripsi

STATUS Benar atau salah, apakah prosesnya berhasil atau gagal.

MESSAGE Pesan sistem, jika ada.

DATA Berisi data yang diminta, misalnya, ini akan menampung daftar
pengguna yang dicari.

Langkah 4: Pemasangan dan Pengujian


Akhirnya, kita memiliki titik akhir yang lengkap yang dilengkapi fungsi CRUD dasar. Yang
tersisa adalah memposting beberapa variabel ke API untuk mengujinya, lalu letakkan online.

Menguji API: test-users.html


<!DOCTYPE html>
<html>
<head>
<title>USER API TEST</title>
</head>
<body>
<h1>Get All Users</h1>
<form action="user-endpoint.php" method="post" target="_blank">
Request <input type="text" name="req" value="get-all" readonly/><br>
<input type="submit" value="Get"/>
</form>

<h1>Get User By Email</h1>


<form action="user-endpoint.php" method="post" target="_blank">
Request <input type="text" name="req" value="get-email" readonly/><br>

12
Email <input type="email" name="email" required/><br>
<input type="submit" value="Get"/>
</form>

<h1>Get User By ID</h1>


<form action="user-endpoint.php" method="post" target="_blank">
Request <input type="text" name="req" value="get-id" readonly/><br>
Email <input type="text" name="id" required/><br>
<input type="submit" value="Get"/>
</form>

<h1>Create New User</h1>


<form action="user-endpoint.php" method="post" target="_blank">
Request <input type="text" name="req" value="create" readonly/><br>
Name <input type="text" name="name" required/><br>
Email <input type="email" name="email" required/><br>
Password <input type="text" name="password" required/><br>
<input type="submit" value="Create"/>
</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.

URL Ramah dengan .htaccess Rewrite

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.

Anti Injeksi & Pemeriksaan Form

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.

Bagaimana dengan Output XML?

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.

Download Source Code

Klik di sini untuk mengunduh contoh di atas (free). Silakan membangun di atasnya atau
menggunakannya dalam proyek Anda.

Penutup: Selanjutnya Apa?


Kita telah sampai pada akhir panduan ini. Saya harap ini memberi Anda wawasan tentang cara
membuat API yang berdayaguna. Terima kasih telah membaca tutorial ini, semoga sukses.
Selamat coding!

16

Anda mungkin juga menyukai