Membangun REST API JSON Sederhana

Konsep REST, metode HTTP, kode status, routing manual dengan $_SERVER, membaca body JSON, respons JSON yang konsisten, validasi, dan menguji API dengan curl.

Part 21 dari 22 ± 55 menit Gratis

Apa itu REST API?

API adalah "pintu" tempat program lain (aplikasi mobile, front-end React, layanan lain) meminta atau mengirim data ke aplikasimu. REST adalah gaya merancang API di atas HTTP dengan aturan sederhana: sumber daya (resource) diberi alamat URL, dan metode HTTP menyatakan aksinya. Format data yang umum adalah JSON.

MetodeURLAksiStatus sukses
GET/tugasDaftar semua tugas200
GET/tugas/5Satu tugas200
POST/tugasBuat tugas baru201
PUT / PATCH/tugas/5Ubah tugas200
DELETE/tugas/5Hapus tugas204

Aturan penamaan: URL berupa kata benda jamak (/tugas), bukan kata kerja (/ambilSemuaTugas); aksi ditentukan oleh metode HTTP.

Kode status HTTP

KodeArtiKapan
200OKBerhasil mengambil/mengubah
201CreatedBerhasil membuat data baru
204No ContentBerhasil, tanpa isi (hapus)
400Bad RequestJSON rusak / permintaan tidak masuk akal
401 / 403Unauthorized / ForbiddenBelum login / tidak punya hak
404Not FoundData atau URL tidak ada
405Method Not AllowedMetode tidak didukung
422Unprocessable ContentData gagal validasi
500Server ErrorBug di sisi server

Fungsi respons JSON

function kirimJson(mixed $data, int $status = 200): never
{
    http_response_code($status);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}

Tipe kembalian never (PHP 8.1) berarti fungsi ini tidak pernah kembali ke pemanggil karena program berhenti di exit.

Membaca permintaan

$metode = $_SERVER['REQUEST_METHOD'];                       // GET, POST, ...
$path   = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // /tugas/5
$segmen = explode('/', trim($path, '/'));                   // ['tugas', '5']

// Body JSON (bukan $_POST!)
$body = json_decode(file_get_contents('php://input'), true, flags: JSON_THROW_ON_ERROR);

$_POST hanya terisi untuk form biasa. Klien API biasanya mengirim JSON mentah, jadi bacalah dari php://input. Dengan JSON_THROW_ON_ERROR JSON rusak melempar JsonException yang bisa kamu ubah menjadi respons 400.

Routing sederhana

try {
    $id = isset($segmen[1]) ? (int) $segmen[1] : null;

    if ($segmen[0] !== 'tugas') {
        kirimJson(['error' => 'Rute tidak ditemukan'], 404);
    }

    match (true) {
        $metode === 'GET' && $id === null  => kirimJson($repo->semua()),
        $metode === 'GET' && $id !== null  => kirimJson($repo->cari($id) ?? kirimJson(['error' => 'Tidak ditemukan'], 404)),
        $metode === 'POST' && $id === null => buatTugas($repo),
        default                       => kirimJson(['error' => 'Metode tidak didukung'], 405),
    };
} catch (JsonException) {
    kirimJson(['error' => 'JSON tidak valid'], 400);
}

Validasi dan respons error yang konsisten

function buatTugas(TugasRepository $repo): never
{
    $body = json_decode(file_get_contents('php://input'), true, flags: JSON_THROW_ON_ERROR);

    $judul = trim((string) ($body['judul'] ?? ''));
    if ($judul === '') {
        kirimJson(['error' => 'Validasi gagal', 'detail' => ['judul' => 'Judul wajib diisi']], 422);
    }

    $tugas = $repo->simpan($judul);
    kirimJson($tugas, 201);
}

Pilih satu bentuk error dan pakai di mana-mana, misalnya {"error": "pesan", "detail": {...}}. Klien jadi mudah menanganinya.

Menjalankan dan mencoba

php -S localhost:8000 index.php

curl http://localhost:8000/tugas
curl -X POST http://localhost:8000/tugas \
     -H "Content-Type: application/json" \
     -d '{"judul":"Belajar REST"}'
curl -i http://localhost:8000/tugas/999        # -i menampilkan status 404

Praktik yang baik

  • Selalu kirim Content-Type: application/json dan status yang tepat, bukan 200 untuk semuanya.
  • Jangan membocorkan pesan error internal (query SQL, path berkas) ke klien; catat ke log, kirim pesan umum dengan status 500.
  • Validasi semua input; jangan percaya klien. Gunakan prepared statement untuk database.
  • Pakai versi pada URL jika API akan berkembang: /api/v1/tugas.
  • Amankan dengan token (header Authorization: Bearer ...) dan batasi laju permintaan untuk API publik. Di proyek besar, pakai framework seperti Laravel yang sudah menyediakan routing, validasi, dan autentikasi.

Error umum

  • Body kosong padahal klien mengirim JSON → membaca $_POST, seharusnya php://input.
  • Cannot modify header information - headers already sent → ada output (spasi/echo) sebelum header(). Panggil header dulu, dan jangan menutup berkas dengan ?>.
  • JSON tampil sebagai teks di browser tanpa format → lupa header Content-Type.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X