Membuat dan mengonsumsi API sederhana dengan PHP

From OnnoWiki
Revision as of 09:10, 6 April 2025 by Onnowpurbo (talk | contribs) (Created page with "Berikut adalah modul "Membuat dan Mengonsumsi API Sederhana dengan PHP" sebagai bagian dari mata kuliah Pemrograman Web, dengan fokus pada pengantar RESTful API menggunakan Ub...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Berikut adalah modul "Membuat dan Mengonsumsi API Sederhana dengan PHP" sebagai bagian dari mata kuliah Pemrograman Web, dengan fokus pada pengantar RESTful API menggunakan Ubuntu 24.04. Modul ini mencakup langkah-langkah praktis dan contoh implementasi tanpa menggunakan alat dari Microsoft.

    1. Pendahuluan

RESTful API (Representational State Transfer) adalah arsitektur yang memungkinkan komunikasi antara klien dan server melalui protokol HTTP. Dalam modul ini, kita akan membahas cara membuat API sederhana menggunakan PHP dan MySQL, serta bagaimana mengonsumsi API tersebut.

    1. 1. Persiapan Lingkungan
      1. 1.1. Instalasi Apache, MySQL, dan PHP

Pastikan sistem Ubuntu 24.04 Anda telah terinstal Apache, MySQL, dan PHP (LAMP stack). Jika belum, Anda dapat menginstalnya dengan perintah berikut:

```bash sudo apt update sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql -y ``` 

Setelah instalasi, amankan MySQL dengan menjalankan:

```bash sudo mysql_secure_installation ``` 

      1. 1.2. Konfigurasi Direktori Proyek

Buat direktori untuk proyek Anda di direktori root web server:

```bash sudo mkdir /var/www/html/restful-api sudo chown -R $USER:$USER /var/www/html/restful-api ``` 

    1. 2. Membuat Database dan Tabel
      1. 2.1. Membuat Database

Masuk ke MySQL dan buat database baru:

```bash mysql -u root -p ``` 

Setelah masuk ke prompt MySQL, jalankan:

```sql CREATE DATABASE db_api; USE db_api; ``` 

      1. 2.2. Membuat Tabel

Buat tabel `products` dengan struktur berikut:

```sql CREATE TABLE products (

   id INT AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(100) NOT NULL,
   description TEXT,
   price DECIMAL(10, 2) NOT NULL,
   created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

); ``` 

    1. 3. Membuat API dengan PHP
      1. 3.1. Struktur Proyek

Atur struktur direktori proyek Anda sebagai berikut:

```

restful-api/ ├── api │ ├── config │ │ └── Database.php │ ├── objects │ │ └── Product.php │ ├── product │ │ ├── create.php │ │ ├── delete.php │ │ ├── read.php │ │ ├── read_one.php │ │ └── update.php │ └── index.php └── .htaccess ``` 

      1. 3.2. Konfigurasi Database

Buat file `Database.php` di direktori `api/config` dengan isi berikut:

```php <?php class Database {

   private $host = "localhost";
   private $db_name = "db_api";
   private $username = "root";
   private $password = "";
   public $conn;
   public function getConnection() {
       $this->conn = null;
       try {
           $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
           $this->conn->exec("set names utf8");
       } catch (PDOException $exception) {
           echo "Koneksi error: " . $exception->getMessage();
       }
       return $this->conn;
   }

} ?> ``` 

      1. 3.3. Membuat Model Produk

Buat file `Product.php` di direktori `api/objects` dengan isi berikut:

```php <?php class Product {

   private $conn;
   private $table_name = "products";
   public $id;
   public $name;
   public $description;
   public $price;
   public $created_at;
   public function __construct($db) {
       $this->conn = $db;
   }
   function read() {
       $query = "SELECT id, name, description, price, created_at FROM " . $this->table_name . " ORDER BY created_at DESC";
       $stmt = $this->conn->prepare($query);
       $stmt->execute();
       return $stmt;
   }
   function create() {
       $query = "INSERT INTO " . $this->table_name . " SET name=:name, description=:description, price=:price";
       $stmt = $this->conn->prepare($query);
       $this->name = htmlspecialchars(strip_tags($this->name));
       $this->description = htmlspecialchars(strip_tags($this->description));
       $this->price = htmlspecialchars(strip_tags($this->price));
       $stmt->bindParam(":name", $this->name);
       $stmt->bindParam(":description", $this->description);
       $stmt->bindParam(":price", $this->price);
       if ($stmt->execute()) {
           return true;
       }
       return false;
   }
   function readOne() {
       $query = "SELECT id, name, description, price, created_at FROM " . $this->table_name . " WHERE id = ? LIMIT 0,1";
       $stmt = $this->conn->prepare($query);
       $stmt->bindParam(1, $this->id);
       $stmt->execute();
       $row = $stmt->fetch(PDO::FETCH_ASSOC);
       if ($row) {
           $this->name = $row['name'];
           $this->description = $row['description'];
           $this->price = $row['price'];
           $this->created_at = $row['created_at'];
           return true;
       }
       return false;
   }
   function update() {
       $query = "UPDATE " . $this->table_name . " SET name = :name, description = :description, price = :price WHERE id = :id";
       $stmt = $this->conn->prepare($query);
       $this->name = htmlspecialchars(strip_tags($this->name));
       $this->description = htmlspecialchars(strip_tags($this->description));
       $this->price = htmlspecialchars(strip_tags($this->price));
       $this-> 




Melanjutkan modul sebelumnya tentang "Membuat dan Mengonsumsi API Sederhana dengan PHP" pada mata kuliah Pemrograman Web, berikut adalah langkah-langkah tambahan untuk melengkapi implementasi RESTful API dengan operasi **Update** dan **Delete**, serta cara mengonsumsi API tersebut menggunakan PHP di lingkungan Ubuntu 24.04.

    1. 4. Menambahkan Operasi Update dan Delete pada API
      1. 4.1. Endpoint Update (PUT)

Buat file `update.php` di direktori `api/product` dengan isi berikut:


```php <?php // Header yang diperlukan header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: PUT"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// Sertakan file yang diperlukan include_once '../config/Database.php'; include_once '../objects/Product.php';

// Dapatkan koneksi database $database = new Database(); $db = $database->getConnection();

// Persiapkan objek produk $product = new Product($db);

// Dapatkan data yang dikirim $data = json_decode(file_get_contents("php://input"));

// Pastikan data yang diperlukan tersedia if (!empty($data->id) && (!empty($data->name) || !empty($data->description) || !empty($data->price))) {

   // Set ID produk yang akan diperbarui
   $product->id = $data->id;
   // Set properti produk berdasarkan data yang tersedia
   if (!empty($data->name)) {
       $product->name = $data->name;
   }
   if (!empty($data->description)) {
       $product->description = $data->description;
   }
   if (!empty($data->price)) {
       $product->price = $data->price;
   }
   // Perbarui produk
   if ($product->update()) {
       // Set respons kode 200 - OK
       http_response_code(200);
       echo json_encode(array("message" => "Produk berhasil diperbarui."));
   } else {
       // Set respons kode 503 - Service Unavailable
       http_response_code(503);
       echo json_encode(array("message" => "Gagal memperbarui produk."));
   }

} else {

   // Set respons kode 400 - Bad Request
   http_response_code(400);
   echo json_encode(array("message" => "Data tidak lengkap."));

} ?> ``` 

    • Penjelasan:**

- **Header HTTP:** Menentukan bahwa metode yang diizinkan adalah PUT dan mengatur tipe konten sebagai JSON. - **Membaca Input:** Mengambil data JSON yang dikirim oleh klien. - **Validasi Data:** Memastikan bahwa ID produk dan setidaknya satu atribut lainnya disertakan dalam permintaan. - **Memperbarui Produk:** Memanggil metode `update()` pada objek produk untuk memperbarui data di database.

      1. 4.2. Endpoint Delete (DELETE)

Buat file `delete.php` di direktori `api/product` dengan isi berikut:


```php <?php // Header yang diperlukan header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: DELETE"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// Sertakan file yang diperlukan include_once '../config/Database.php'; include_once '../objects/Product.php';

// Dapatkan koneksi database $database = new Database(); $db = $database->getConnection();

// Persiapkan objek produk $product = new Product($db);

// Dapatkan ID produk yang akan dihapus $data = json_decode(file_get_contents("php://input"));

// Pastikan ID produk tersedia if (!empty($data->id)) {

   // Set ID produk yang akan dihapus
   $product->id = $data->id;
   // Hapus produk
   if ($product->delete()) {
       // Set respons kode 200 - OK
       http_response_code(200);
       echo json_encode(array("message" => "Produk berhasil dihapus."));
   } else {
       // Set respons kode 503 - Service Unavailable
       http_response_code(503);
       echo json_encode(array("message" => "Gagal menghapus produk."));
   }

} else {

   // Set respons kode 400 - Bad Request
   http_response_code(400);
   echo json_encode(array("message" => "ID produk tidak ditemukan."));

} ?> ``` 

    • Penjelasan:**

- **Header HTTP:** Menentukan bahwa metode yang diizinkan adalah DELETE dan mengatur tipe konten sebagai JSON. - **Membaca Input:** Mengambil data JSON yang dikirim oleh klien. - **Validasi Data:** Memastikan bahwa ID produk disertakan dalam permintaan. - **Menghapus Produk:** Memanggil metode `delete()` pada objek produk untuk menghapus data dari database.

    1. 5. Mengonsumsi RESTful API Menggunakan PHP

Untuk mengonsumsi RESTful API yang telah dibuat, kita dapat menggunakan ekstensi cURL di PHP. Berikut adalah contoh bagaimana melakukan operasi **GET**, **POST**, **PUT**, dan **DELETE** menggunakan cURL.

      1. 5.1. Konfigurasi cURL

Buat file `api_client.php` dengan fungsi berikut untuk memanggil API:


```php <?php function callAPI($method, $url, $data = false) {

   $curl = curl_init();
   switch (strtoupper($method)) {
       case "POST":
           curl_setopt($curl, CURLOPT_POST, 1);
           if ($data)
               curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
           break;
       case "PUT":
           curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
           if ($data)
               curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
           break;
       case "DELETE":
           curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
           if ($data)
               curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
           break;
       default: // GET
           if ($data)
               $url = sprintf("%s?%s", $url, http_build_query($data));
   }
   // Opsi umum
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($curl, CURLOPT_HTTPHEADER, array(
       'Content-Type: application/json',
   ));
   $result