API Hello World
|-Simpel
Akses: https://www.example.org/helloworld-simpel
<?php
//nama file: helloworld-simpel.php
// Ini untuk mengaktifkan error pada saat produksi
// matikan jika sudah live
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
/*
* Halaman Hello World Simpel
*/
//format request: https://www.example.org/helloworld-simpel
$un = filter_input(INPUT_POST, "username", FILTER_SANITIZE_STRING);
$ps = filter_input(INPUT_POST, "password", FILTER_SANITIZE_STRING);
//set format JSON untuk API dan menon-aktifkan cache browser
header('Content-Type: application/json');
header('Cache-Control: no-store');
//username dan password dapat juga disimpan di basis data
if ($un == "hello" && $ps == "world")
echo json_encode(["kode" => "00", "pesan" => "Hello World"]);
else
echo json_encode(["kode" => "99", "pesan" => "Wrong username or password"]);
|-Dengan Token
Akses: https://www.example.org/token, kemudian https://www.example.org/helloworld-token
- Siapkan basis data untuk menyimpan informasi token yang berhasil dibuatA). Pada basis data setidak-tidaknya terdapat kolom tokenA.1), waktu kadaluarsaA.2) dan usernameA.3). Pada basis data ini didesain dalam 1 hari hanya ada satu token untuk setiap user, sehingga dibuat indeks unik untuk tanggal pembuatan token dan user yang membuat tokenA.4.
- Buat trigger untuk basis data untuk meyimpan informasi token tersebutB) agar:
- token dapat dibuat secara acakB.5)
- waktu kadaluarsa dapat dibuat hari ini (now()) jam 23:59:59B.6)
- tanggal pembuatan diatur pada tanggal sekarang (date(now()))B.7)
- Buat prosedur untuk mendapatkan tokenC)
- masukkan username ke dalam tabel untuk menyimpan informasi token apabila username belum ada pada tabelC.9) (kerjasama on duplicate key updateC.9) dan indeks unikA.4))
- berikan informasi token dan waktu kadaluarsanyaC.10)
- Buat prosedur untuk mengecek token D) yang mengembalikan nilai 1 apabila token ada dan tidak kadaluarsaD.10)
DELIMITER $$
#A
CREATE TABLE `token` (
#A.1
`idtoken` char(36) NOT NULL,
#A.2
`expired` datetime DEFAULT NULL,
`createdtime` datetime DEFAULT NULL,
`createddate` date DEFAULT NULL,
#A.3
`username` char(10) DEFAULT NULL,
PRIMARY KEY (`idtoken`),
#A.4
UNIQUE KEY `call` (`createddate`,`username`),
KEY `expired` (`expired`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8$$
#B
CREATE DEFINER=`root`@`localhost` TRIGGER `spc`.`token_BEFORE_INSERT` BEFORE INSERT ON `token` FOR EACH ROW
BEGIN
#B.5
set NEW.idtoken = rpad(replace(uuid(), "-", ""), 36, floor(rand()*1000));
#B.6
set NEW.expired = concat(date(now()), ' 23:59:59');
set NEW.createdtime = now();
#B.7
set NEW.createddate = date(now());
END$$
#C
CREATE DEFINER=`root`@`localhost` PROCEDURE `token`(username_ char(10))
BEGIN
#C.8
insert into token(username) values (username_) on duplicate key update username=username_;
#C.9
select idtoken, expired from token where username=username_ and createddate=date(now());
END$$
#D
CREATE DEFINER=`root`@`localhost` FUNCTION `validasitoken`(token_ varchar(40)) RETURNS int(11)
BEGIN
#D.10
return ifnull((select 1 from token where idtoken=token_ and expired>now()), 0);
END
DELIMITER ;
- Siapkan berkas library untuk method-method yang umum dan sering digunakan
<?php
//nama file: lib.php
/**
* method untuk menampilkan json respon dari API
* @param String $status kode respon
* @param String $message pesan respon
*/
function response($status, $message, $data)
{
//buat array respon
$respon["status"] = $status;
$respon["message"] = $message;
//ubah data menjadi array 2 dimensi
foreach ($data as $id => $isi)
{
$respon[$id] = $isi;
}
//tampilkan respon API
echo json_encode($respon);
}
/**
* method untuk melakukan validasi terhadap token yang digunakan, diletakkan setelah koneksi dilakukan
* @global MySQLi $conn
* @param String $token Token
*/
function validasi_token($token)
{
global $conn;
//cek apakah token ada dan tidak kadaluarsa?
$stmt = $conn->prepare("select validasitoken(?) as valid");
$stmt->bind_param("s", $token);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
return $row['valid'];
} }
- Buat program untuk mendapatkan token
<?php
//nama file: token.php
// Ini untuk mengaktifkan error pada saat produksi
// matikan jika sudah live
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
/*
* Halaman Get Token
*/
//format request: https://www.example.org/token
$un = filter_input(INPUT_POST, "username", FILTER_SANITIZE_STRING);
$ps = filter_input(INPUT_POST, "password", FILTER_SANITIZE_STRING);
//set format JSON untuk API dan menon-aktifkan cache browser
header('Content-Type: application/json');
header('Cache-Control: no-store');
//username dan password dapat juga disimpan di basis data
if ($un == "hello" && $ps == "world")
{
//koneksi ke basis data secara aman
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$conn->ssl_set('/etc/mysql/ssl/client-key.pem', '/etc/mysql/ssl/client-cert.pem', '/etc/mysql/ssl/ca-cert.pem', NULL, NULL);
$conn->real_connect($servername, $username, $password, $dbname, 3306, NULL, MYSQLI_CLIENT_SSL);
if ($conn->connect_error)
{
response ("91", "Webservice temporary unavailable", ["token" => ""]);
}
else
{
$stmt = $conn->prepare("call h2htoken(?)");
$stmt->bind_param("s", $un);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
response ("00", "Approve, token expired: " . $row['expired'], ["token" => $row['idtoken']]);
}
if (method_exists($stmt,'close'))
{
$stmt->close();
}
}
}
else
response ("99", "Wrong username or password", ["token" => ""]);
<?php
//nama file: helloworld-token.php
// Ini untuk mengaktifkan error pada saat produksi
// matikan jika sudah live
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
/*
* Halaman Hello World Dengan Token
*/
//format request: https://www.example.org/helloworld-token
$tkn = filter_input(INPUT_POST, "token", FILTER_SANITIZE_STRING);
//set format JSON untuk API dan menon-aktifkan cache browser
header('Content-Type: application/json');
header('Cache-Control: no-store');
if (validasi_token($tkn))
echo json_encode(["kode" => "00", "pesan" => "Hello World"]);
else
echo json_encode(["kode" => "92", "pesan" => "Token invalid or expired"]);
Testing
Percobaan dapat menggunakan add-ons RESTer pada browser Mozilla Firefox
Demikian, semoga bermanfaat. [bst]