Tutorial Pembuatan RESTful API - Mockup Coffee
Tags: php
Published: 2022-11-22 15:31:53

## Hi! everyone,
Pada penulisan artikel kali ini saya akan memberikan tutorial sederhana bagaimana cara membuat sebuah web service menggunakan RESTful API dengan bahasa pemrograman PHP. Bagi Anda yang belum tahu apa itu RESTful API ? Artikel ini sangat cocok bagi kalian yang belum tahu atau belum paham secara jelas mengenai RESTful API. Secara singkat RESTful API ini adalah sebuah web service atau layanan yang memanfaatkan konsep metodologi HTTP sebagai media transfer datanya. Pada RESTful API ini, bentuk data yang digunakan bisa disesuaikan dengan kebutuhan Anda, yang populer biasa digunakan yaitu JSON dan XML. Manfaat dari penggunaan RESTful API yaitu Anda tidak perlu memasang apapun dari sisi client. Itulah penjelasan singkat mengenai RESTful API.

Agar lebih jelas pembahasan mengenai RESTful API, saya akan memberikan contoh studi kasus project akhir saya mengenai "Mockup Coffee".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iwud7bm29t2b09xs4x6d.png)

Tools yang digunakan dalam pembuatan RESTful API sederhana kali ini yaitu Visual Studio Code, XAMPP, dan POSTMAN.

**RESTful API sederhana menggunakan PHP**

**Lihat script di bawah ini :**

```
<?php

$file_db = "coffee.db";

try{
    $pdo = new PDO("sqlite:$file_db");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $sql_create = "CREATE TABLE IF NOT EXISTS 'pesanan' (
                  'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT,
                  'nama' TEXT CHECK (LENGTH(nama) <= 100),
                  'alamat' text NOT NULL,
                  'jumlah_pesanan' integer NOT NULL,
                  'harga' integer NOT NULL,
                  'metode_pembayaran' TEXT CHECK (metode_pembayaran IN ('DANA', 'OVO', 'GOPAY')) NOT NULL DEFAULT 'DANA',
                  'created_at' datetime NOT NULL DEFAULT CURRENT_TIMESTAMP)";
    $pdo->exec($sql_create);
}catch (PDOException $e){
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

header('Content-Type: application/json');

/**
 * METHOD REST :
 * 
 * - GET : UNTUK MENDAPATKAN DATA DARI SERVER
 * - POST : UNTUK MENGINPUTKAN DATA BARU
 * - PUT : UNTUK MENGUPDATE DATA YANG SUDAH ADA
 * - DELETE : UNTUK MENGHAPUS DATA
 * 
 */

 if($_SERVER['REQUEST_METHOD'] === 'GET') {
    # UNTUK MENGAKSES DATA DARI SERVER
    $query = 'select * from pesanan order by created_at';
    $stmt = $pdo->prepare($query);
    $stmt->execute();
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode($data);
 } else if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    #UNTUK MENAMBAH DATA BARU DARI SERVER
    $nama = $_POST['nama'];
    $alamat = $_POST['alamat'];
    $jml_pesanan = $_POST['jumlah_pesanan'];
    $harga = $_POST['harga'];
    $method_bayar = $_POST['metode_pembayaran'];
    $query = 'insert into pesanan(nama, alamat, jumlah_pesanan, harga, metode_pembayaran) values (?, ?, ?, ?, ?)';
    $stmt = $pdo->prepare($query);
    $res = $stmt->execute([$nama, $alamat, $jml_pesanan, $harga, $method_bayar]);

    if($res) {
      $data = ['nama'=>$nama, 'alamat'=>$alamat, 'jumlah_pesanan'=>$jml_pesanan, 'harga'=>$harga, 'metode_pembayaran'=>$method_bayar];
      echo json_encode($data);
    } else {
      echo json_encode(['error'=>$stmt->errorCode()]);
    }
 } else if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    #UNTUK MENGHAPUS DATA DARI SERVER
    $id = $_GET['id'];
    $query = 'delete from pesanan where id = ? ';
    $stmt = $pdo->prepare($query);
    $res = $stmt->execute([$id]);
    if($res) {
      $data = ['id' => $id];
      echo json_encode($data);
    } else {
      echo json_encode(['error' => $stmt->errorCode()]);
    }
 }
 ?>
```
**Penjelasan :**

- 
Pertama kita membuat sebuah file dengan ekstensi PHP dan di dalamnya memuat tag <?php ?> untuk menuliskan script RESTful API yang akan kita buat pada kali ini.

- 
Kita membuat sebuah variabel untuk menyimpan file database yang akan kita buat. Berikut contoh script nya : `$file_db = "coffee.db";`

- 
Kemudian kita akan membuat sebuah koneksi ke database menggunakan pengkondisian try and catch. Kode yang terdapat di dalam try{} akan dieksekusi terlebih dahulu, jika terdapat sebuah error...kode catch{} akan menangkap error dari try{} dan akan ditampilkan dalam bentuk sebuah pesan error. 
**Berikut contoh script nya :**

```
try{
    $pdo = new PDO("sqlite:$file_db");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $sql_create = "CREATE TABLE IF NOT EXISTS 'pesanan' (
                  'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT,
                  'nama' TEXT CHECK (LENGTH(nama) <= 100),
                  'alamat' text NOT NULL,
                  'jumlah_pesanan' integer NOT NULL,
                  'harga' integer NOT NULL,
                  'metode_pembayaran' TEXT CHECK (metode_pembayaran IN ('DANA', 'OVO', 'GOPAY')) NOT NULL DEFAULT 'DANA',
                  'created_at' datetime NOT NULL DEFAULT CURRENT_TIMESTAMP)";
    $pdo->exec($sql_create);
}catch (PDOException $e){
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}
```

- 
`$pdo = new PDO("sqlite:$file_db");` Di bagian script ini , PDO merupakan sebuah class yang berfungsi untuk merepresentasikan koneksi antara script PHP dan database server. Di sini kita menggunakan database SQLite.

- 
Perhatikan script di bawah !
Script tersebut digunakan untuk membuat sebuah tabel baru, jika sebelumnya kita belum pernah sama sekali membuat sebuah tabel di dalam database yang telah kita buat.
```
$sql_create = "CREATE TABLE IF NOT EXISTS 'pesanan' (
                  'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT,
                  'nama' TEXT CHECK (LENGTH(nama) <= 100),
                  'alamat' text NOT NULL,
                  'jumlah_pesanan' integer NOT NULL,
                  'harga' integer NOT NULL,
                  'metode_pembayaran' TEXT CHECK (metode_pembayaran IN ('DANA', 'OVO', 'GOPAY')) NOT NULL DEFAULT 'DANA',
                  'created_at' datetime NOT NULL DEFAULT CURRENT_TIMESTAMP)";
```

- 
Setelah komponen/atribut table tersebut dibuat, kemudian script tersebut akan dieksekusi menggunakan syntax berikut : 
`$pdo->exec($sql_create);`

- 
`header('Content-Type: application/json');`
Script diatas berfungsi untuk memberitahu sistem bahwa data yang harus diolah oleh sistem, hanya data berupa json. Data selain json, sistem akan menolaknya dan akan menampilkan pesan error.

- 
Di dalam RESTful service terdapat beberapa method yang biasanya digunakan, yaitu :
`GET : UNTUK MENDAPATKAN DATA DARI SERVER`
`POST : UNTUK MENGINPUTKAN DATA BARU`
`PUT : UNTUK MENGUPDATE DATA YANG SUDAH ADA`
`DELETE : UNTUK MENGHAPUS DATA`

- 
Perhatikan dengan baik-baik script di bawah ini !
Script dibawah berfungsi untuk menerima request dari sisi client. 

```
 if($_SERVER['REQUEST_METHOD'] === 'GET') {
    # UNTUK MENGAKSES DATA DARI SERVER
    $query = 'select * from pesanan order by created_at';
    $stmt = $pdo->prepare($query);
    $stmt->execute();
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode($data);
 } else if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    #UNTUK MENAMBAH DATA BARU DARI SERVER
    $nama = $_POST['nama'];
    $alamat = $_POST['alamat'];
    $jml_pesanan = $_POST['jumlah_pesanan'];
    $harga = $_POST['harga'];
    $method_bayar = $_POST['metode_pembayaran'];
    $query = 'insert into pesanan(nama, alamat, jumlah_pesanan, harga, metode_pembayaran) values (?, ?, ?, ?, ?)';
    $stmt = $pdo->prepare($query);
    $res = $stmt->execute([$nama, $alamat, $jml_pesanan, $harga, $method_bayar]);

    if($res) {
      $data = ['nama'=>$nama, 'alamat'=>$alamat, 'jumlah_pesanan'=>$jml_pesanan, 'harga'=>$harga, 'metode_pembayaran'=>$method_bayar];
      echo json_encode($data);
    } else {
      echo json_encode(['error'=>$stmt->errorCode()]);
    }
 } else if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    #UNTUK MENGHAPUS DATA DARI SERVER
    $id = $_GET['id'];
    $query = 'delete from pesanan where id = ? ';
    $stmt = $pdo->prepare($query);
    $res = $stmt->execute([$id]);
    if($res) {
      $data = ['id' => $id];
      echo json_encode($data);
    } else {
      echo json_encode(['error' => $stmt->errorCode()]);
    }
 }
```
- 
Syntax berikut berfungsi menerima request pesan dari client.

`$_SERVER['REQUEST_METHOD'] === 'GET'`
`$_SERVER['REQUEST_METHOD'] === 'POST'`
`$_SERVER['REQUEST_METHOD'] === 'DELETE'`

- 
Query untuk menampilkan data server yang telah diinput client menggunakan `$_SERVER['REQUEST_METHOD'] === 'POST'`

`$query = 'select * from pesanan order by created_at';`

Data diurutkan berdasarkan waktu penginputan data yang terkecil.

- 
Untuk menginputkan data ke server, client menggunakan method `$_SERVER['REQUEST_METHOD'] === 'POST'`
Berikut adalah script **POST** :

```
$nama = $_POST['nama'];
$alamat = $_POST['alamat'];
$jml_pesanan = $_POST['jumlah_pesanan'];
$harga = $_POST['harga'];
$method_bayar = $_POST['metode_pembayaran'];
$query = 'insert into pesanan(nama, alamat, jumlah_pesanan, harga, metode_pembayaran) values (?, ?, ?, ?, ?)';
$stmt = $pdo->prepare($query);
$res = $stmt->execute([$nama, $alamat, $jml_pesanan, $harga, $method_bayar]);

if($res) {
   $data = ['nama'=>$nama, 'alamat'=>$alamat, 'jumlah_pesanan'=>$jml_pesanan, 'harga'=>$harga, 'metode_pembayaran'=>$method_bayar];
   echo json_encode($data);
} else {
   echo json_encode(['error'=>$stmt->errorCode()]);
}
```
Terdapat suatu pengkondisian di dalam method diatas, perhatikan script berikut :

```
if($res) {
      $data = ['nama'=>$nama, 'alamat'=>$alamat, 'jumlah_pesanan'=>$jml_pesanan, 'harga'=>$harga, 'metode_pembayaran'=>$method_bayar];
      echo json_encode($data);
    } else {
      echo json_encode(['error'=>$stmt->errorCode()]);
    }
```
Jika value data yang diinputkan berhasil, maka data tersebut akan dicetak kembali menggunakan syntax :
`echo json_encode($data);`
Jika terdapat kesalahan dalam pengisian suatu data, maka akan menampilkan pesan error nya dibagian mana menggunakan syntax :
`echo json_encode(['error'=>$stmt->errorCode()]);`

- 
Untuk menghapus data inputan client yang telah masuk di server, client bisa menggunakan `$_SERVER['REQUEST_METHOD'] === 'DELETE'`
Berikut adalah script **DELETE** :

```
$id = $_GET['id'];
$query = 'delete from pesanan where id = ? ';
$stmt = $pdo->prepare($query);
$res = $stmt->execute([$id]);
 if($res) {
   $data = ['id' => $id];
   echo json_encode($data);
 } else {
   echo json_encode(['error' => $stmt->errorCode()]);
 }
```
Bisa diperhatikan di bagian syntax berikut :

```
$id = $_GET['id'];
$query = 'delete from pesanan where id = ? ';
```
Di bagian syntax di atas, kita mengambil data `id` dari server menggunakan method `$_GET`, lalu dimasukkan ke dalam variable `$id`.
Kemudian eksekusi syntax : `$query = 'delete from pesanan where id = ? ';`
dilakukan penghapusan suatu data berdasarkan field `id` dari server menggunakan syntax query tersebut.
Di dalam `$_SERVER['REQUEST_METHOD'] === 'DELETE'` terdapat suatu pengkondisian, perhatikan script berikut :

```
if($res) {
  $data = ['id' => $id];
  echo json_encode($data);
} else {
  echo json_encode(['error' => $stmt->errorCode()]);
}
```
Jika value data field `id` yang diinputkan oleh client terdapat di dalam suatu server, maka data tersebut akan dihapus dari server dan dicetak keterangan penghapusan data menggunakan syntax : 
`echo json_encode($data);`
Jika `id` yang diinputkan oleh client tidak terdapat di dalam server, maka akan menampilkan pesan error nya menggunakan syntax :
`echo json_encode(['error'=>$stmt->errorCode()]);`

- 
Kemudian tahap selanjutnya, buka aplikasi POSTMAN untuk melakukan konfigurasi pengecekan data apakah script PHP yang telah kita buat sebelumnya telah berfungsi dengan baik atau tidak.

- 
Setelah masuk di aplikasi **POSTMAN**, klik di bagian **new**.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xd1x82yl496bejm30rys.png)

- 
Pilih **HTTP Request**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yt4os7u36m1o1drtbd3g.png)

- 
Kemudian **masukkan url local pada server XAMPP**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5di9jshuf7vor7oze9sr.png)

- 
Setelah url local folder kita telah diinputkan di bagian tersebut, kita pilih MENU RESTful service yang kita inginkan.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yyol3hai7hm6rvz98aug.png)

- 
Sekarang saya akan berperan sebagai client, saya akan menjalankan method `$_SERVER['REQUEST_METHOD'] === 'GET'` dan jangan lupa untuk klik di bagian **SEND**.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02mglq0b7sk5hinxg4is.png)

**Hasil :**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kh63yen5837yeqsafl43.png)

- 
Kemudian saya akan menginputkan data ke dalam server menggunakan method `$_SERVER['REQUEST_METHOD'] === 'POST'`

Pertama, pilih menu RESTful service POST

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e9wnpnc2sxzqcr422hdv.png)

Kemudian, klik pilihan **Body**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pk7i4h7u0c36m9dp37y.png)

Setelah masuk ke Body, klik menu form-data

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5zxnab3078zueks0od0y.png)

Kemudian masukkan Key dan Value pada field atau atribut sesuai dengan script PHP berikut :
```
$query = 'insert into pesanan(nama, alamat, jumlah_pesanan, harga, metode_pembayaran) values (?, ?, ?, ?, ?)';
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rxeq9w2k1n19lcth9b8i.png)

Kemudian klik SEND, dan berikut hasilnya :

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ohyolfum6a5ogpg0fyt.png)

Lakukan pengisian sebanyak data yang ingin kalian masukan, disini saya akan menginputkan 3 data dan saya tampilkan menggunakan `$_SERVER['REQUEST_METHOD'] === 'GET'` berikut hasilnya :

```
[
    {
        "id": "4",
        "nama": "Rizal Pratama",
        "alamat": "Perum Dewi Sartika",
        "jumlah_pesanan": "2",
        "harga": "25000",
        "metode_pembayaran": "DANA",
        "created_at": "2022-11-22 15:06:55"
    },
    {
        "id": "5",
        "nama": "Farah Faradilla",
        "alamat": "Jalan Medan Merdeka Blok H",
        "jumlah_pesanan": "4",
        "harga": "20000",
        "metode_pembayaran": "OVO",
        "created_at": "2022-11-22 15:09:52"
    },
    {
        "id": "6",
        "nama": "Aisyah Humairoh",
        "alamat": "Jalan Kelud Utara Blok G",
        "jumlah_pesanan": "5",
        "harga": "25000",
        "metode_pembayaran": "GOPAY",
        "created_at": "2022-11-22 15:10:44"
    }
]
```
Data telah berhasil diinputkan ke dalam server !

- 
Kemudian saya ingin menghapus data dari server dengan `id = 5`
Pertama, pilih menu RESTful service DELETE

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sqgqcl8jiiwnwkaaerxa.png)

Kemudian klik di bagian menu **params**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/amvvwrmyrs52q1czvdqm.png)

Setelah itu masukkan Key dan Value field atau atribut `id` pada kolom tersebut, karena saya ingin menghapus data dengan `id = 5` maka value yang saya masukkan bernilai 5.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8nal8bug8ey6oh9pdzd7.png)

Kemudian klik SEND dan kembali ke 
method `$_SERVER['REQUEST_METHOD'] === 'GET'` untuk melihat data server yang telah dihapus, dan berikut hasilnya :

```
{
    "id": "5"
}
```
**Hasil :**

```
[
    {
        "id": "4",
        "nama": "Rizal Pratama",
        "alamat": "Perum Dewi Sartika",
        "jumlah_pesanan": "2",
        "harga": "25000",
        "metode_pembayaran": "DANA",
        "created_at": "2022-11-22 15:06:55"
    },
    {
        "id": "6",
        "nama": "Aisyah Humairoh",
        "alamat": "Jalan Kelud Utara Blok G",
        "jumlah_pesanan": "5",
        "harga": "25000",
        "metode_pembayaran": "GOPAY",
        "created_at": "2022-11-22 15:10:44"
    }
]
```
Data dengan `id = 5` telah berhasil dihapus dari server !