REST API dengan Laravel

Membuat REST API Sederhana Menggunakan Laravel 10/11

Mendukung Laravel v10 & v11

Pengenalan: Apa itu API & REST API?

Apa itu API?

API (Application Programming Interface) adalah sekumpulan instruksi atau "jembatan" yang memungkinkan dua perangkat lunak (aplikasi) berbeda untuk saling berbicara dan bertukar data secara langsung.

Analogi Sederhana: Bayangkan kamu sedang memesan makanan di sebuah restoran.

  • Kamu (Klien/Frontend): Orang yang melihat menu dan ingin memesan makanan.
  • Dapur (Server/Database): Tempat sistem menyimpan resep dan memasak pesanan.
  • Pelayan (API): Kamu tidak mungkin langsung masuk ke dapur untuk mengambil makanan, bukan? Kamu butuh pelayan. Pelayan menerima pesananmu, mengantarnya ke dapur, lalu membawa makanan yang sudah matang kembali kepadamu. Itulah tugas API.

Apa itu REST API?

REST (Representational State Transfer) adalah salah satu standar atau gaya arsitektur yang paling populer dalam membuat API. Jadi, REST API adalah API yang dirancang mengikuti aturan-aturan REST.

Ciri utama dari REST API yang wajib kamu ketahui:

  • Menggunakan HTTP Methods: REST API memanfaatkan aksi HTTP untuk beroperasi. Contoh: GET untuk mengambil data, POST untuk menambah, PUT untuk mengubah, dan DELETE untuk menghapus.
  • Format Data JSON: Saat "pelayan" membawa kembali makanan, wadahnya biasanya menggunakan format JSON (JavaScript Object Notation) karena ringan dan mudah dibaca oleh semua bahasa pemrograman.
  • Stateless: Server tidak mengingat status pengguna di antara request. Setiap kali klien meminta sesuatu, klien harus memberikan informasi yang lengkap (seperti token akses atau ID).
Kenapa kita butuh REST API?
Dengan membangun Backend berbasis REST API menggunakan Laravel, sistem data yang kamu buat (misal: Sistem Informasi PKL, presensi, dll) bisa diakses dan digunakan ulang oleh berbagai macam jenis Frontend (bisa diakses via website, aplikasi Android Studio, maupun aplikasi iOS) secara bersamaan tanpa perlu membongkar ulang database-nya.

Perbedaan Laravel v10 vs v11

Sebelum mulai teknis, pahami dua perbedaan utama yang mempengaruhi tutorial ini:

Hal Laravel v10 Laravel v11
File routes API routes/api.php sudah ada otomatis routes/api.php belum ada, harus dibuat manual
Struktur app/ Ada folder app/Http/Middleware/ Middleware diatur di bootstrap/app.php
Migration & Model Sama persis ✓
Controller Sama persis ✓
Cara testing Sama persis ✓
Di setiap langkah yang berbeda, akan ada tab v10 dan v11 untuk memilih versi yang kamu pakai.

1. Setup Project

1

Buat Project Laravel Baru

Buka terminal, jalankan perintah berikut:

Terminal
composer create-project laravel/laravel products-api

cd products-api

php artisan serve
# Buka: http://127.0.0.1:8000
2

Konfigurasi Database di .env

Buat database bernama products_api di phpMyAdmin atau MySQL, lalu edit file .env:

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=products_api
DB_USERNAME=root
DB_PASSWORD=
Password dikosongkan karena XAMPP default tidak pakai password. Sesuaikan jika berbeda.

2. Migration & Seeder

1

Buat Migration

Terminal
php artisan make:migration create_products_table

Buka file yang muncul di database/migrations/, lalu isi seperti ini:

database/migrations/xxxx_create_products_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->decimal('price', 10, 2);
            $table->integer('stock')->default(0);
            $table->string('category')->nullable();
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('products');
    }
};
Terminal — jalankan migration
php artisan migrate
2

Seeder — Data Dummy (Opsional)

Terminal
php artisan make:seeder ProductSeeder
database/seeders/ProductSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class ProductSeeder extends Seeder
{
    public function run(): void
    {
        DB::table('products')->insert([
            [
                'name'       => 'Laptop ASUS',
                'price'      => 7500000,
                'stock'      => 10,
                'category'   => 'Elektronik',
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'name'       => 'Mouse Logitech',
                'price'      => 150000,
                'stock'      => 50,
                'category'   => 'Aksesori',
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'name'       => 'Keyboard Keychron',
                'price'      => 1200000,
                'stock'      => 15,
                'category'   => 'Aksesori',
                'created_at' => now(),
                'updated_at' => now(),
            ],
        ]);
    }
}
database/seeders/DatabaseSeeder.php — tambahkan ProductSeeder
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            ProductSeeder::class,
        ]);
    }
}
Terminal — jalankan seeder
php artisan migrate:fresh --seed

3. Model

1

Buat Model Product

Terminal
php artisan make:model Product

Edit file app/Models/Product.php:

app/Models/Product.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // Field yang boleh diisi
    protected $fillable = [
        'name',
        'price',
        'stock',
        'category',
    ];
}
$fillable wajib diisi agar bisa pakai Product::create() dan update() tanpa error.

4. Controller

1

Buat Controller

Terminal
php artisan make:controller ProductController
2

Isi ProductController — 5 Method CRUD

Buka app/Http/Controllers/ProductController.php, ganti semua isinya dengan kode berikut:

app/Http/Controllers/ProductController.php
<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    // ───────────────────────────────────────
    // GET /api/products
    // Ambil semua produk
    // ───────────────────────────────────────
    public function index()
    {
        $products = Product::all();

        return response()->json([
            'success' => true,
            'data'    => $products,
        ]);
    }

    // ───────────────────────────────────────
    // GET /api/products/{id}
    // Ambil satu produk berdasarkan ID
    // ───────────────────────────────────────
    public function show($id)
    {
        $product = Product::find($id);

        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Produk tidak ditemukan',
            ], 404);
        }

        return response()->json([
            'success' => true,
            'data'    => $product,
        ]);
    }

    // ───────────────────────────────────────
    // POST /api/products
    // Tambah produk baru
    // ───────────────────────────────────────
    public function store(Request $request)
    {
        $request->validate([
            'name'     => 'required|string',
            'price'    => 'required|numeric',
            'stock'    => 'required|integer',
            'category' => 'nullable|string',
        ]);

        $product = Product::create([
            'name'     => $request->name,
            'price'    => $request->price,
            'stock'    => $request->stock,
            'category' => $request->category,
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Produk berhasil ditambahkan',
            'data'    => $product,
        ], 201);
    }

    // ───────────────────────────────────────
    // PUT /api/products/{id}
    // Update produk
    // ───────────────────────────────────────
    public function update(Request $request, $id)
    {
        $product = Product::find($id);

        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Produk tidak ditemukan',
            ], 404);
        }

        $request->validate([
            'name'     => 'required|string',
            'price'    => 'required|numeric',
            'stock'    => 'required|integer',
            'category' => 'nullable|string',
        ]);

        $product->update([
            'name'     => $request->name,
            'price'    => $request->price,
            'stock'    => $request->stock,
            'category' => $request->category,
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Produk berhasil diperbarui',
            'data'    => $product,
        ]);
    }

    // ───────────────────────────────────────
    // DELETE /api/products/{id}
    // Hapus produk
    // ───────────────────────────────────────
    public function destroy($id)
    {
        $product = Product::find($id);

        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Produk tidak ditemukan',
            ], 404);
        }

        $product->delete();

        return response()->json([
            'success' => true,
            'message' => 'Produk berhasil dihapus',
        ]);
    }
}

5. Routes — Beda v10 & v11

1

Daftar Endpoint

MethodURLFungsi
GET/api/productsAmbil semua produk
GET/api/products/{id}Ambil satu produk
POST/api/productsTambah produk
PUT/api/products/{id}Update produk
DELETE/api/products/{id}Hapus produk
2

Daftarkan Route — Pilih Versi Laravel Kamu

File routes/api.php sudah ada sejak awal, langsung edit saja. <?php use App\Http\Controllers\ProductController; use Illuminate\Support\Facades\Route; Route::get('/products', [ProductController::class, 'index']); Route::get('/products/{id}', [ProductController::class, 'show']); Route::post('/products', [ProductController::class, 'store']); Route::put('/products/{id}', [ProductController::class, 'update']); Route::delete('/products/{id}',[ProductController::class, 'destroy']);
# Di Laravel v11, routes/api.php belum ada. # Jalankan perintah ini dulu untuk membuatnya: php artisan install:api # Perintah di atas akan: # 1. Membuat file routes/api.php # 2. Mendaftarkan route api di bootstrap/app.php # 3. Menginstall Laravel Sanctum (opsional, tidak perlu dipakai dulu) # Setelah itu, buka routes/api.php dan isi: <?php use App\Http\Controllers\ProductController; use Illuminate\Support\Facades\Route; Route::get('/products', [ProductController::class, 'index']); Route::get('/products/{id}', [ProductController::class, 'show']); Route::post('/products', [ProductController::class, 'store']); Route::put('/products/{id}', [ProductController::class, 'update']); Route::delete('/products/{id}',[ProductController::class, 'destroy']);
Terminal — cek route sudah terdaftar
php artisan route:list --path=api

# Output yang muncul:
# GET    api/products
# GET    api/products/{id}
# POST   api/products
# PUT    api/products/{id}
# DELETE api/products/{id}

6. Testing dengan Postman

1

Header yang Wajib Ditambahkan

Setiap request di Postman, tambahkan header ini agar response selalu JSON:

Headers
Accept          : application/json
Content-Type    : application/json
2

GET — Ambil Semua Produk

Request
GET http://127.0.0.1:8000/api/products
Response 200
{
    "success": true,
    "data": [
        {
            "id": 1,
            "name": "Laptop ASUS",
            "price": "7500000.00",
            "stock": 10,
            "category": "Elektronik",
            "created_at": "2025-05-18T10:00:00.000000Z",
            "updated_at": "2025-05-18T10:00:00.000000Z"
        },
        { ... }
    ]
}
3

GET — Ambil Satu Produk

Request
GET http://127.0.0.1:8000/api/products/1
Response 200
{
    "success": true,
    "data": {
        "id": 1,
        "name": "Laptop ASUS",
        "price": "7500000.00",
        "stock": 10,
        "category": "Elektronik",
        "created_at": "...",
        "updated_at": "..."
    }
}
Response 404 (ID tidak ada)
{
    "success": false,
    "message": "Produk tidak ditemukan"
}
4

POST — Tambah Produk Baru

Request — pilih Body → raw → JSON
POST http://127.0.0.1:8000/api/products

{
    "name": "Monitor LG 24 inch",
    "price": 2800000,
    "stock": 5,
    "category": "Elektronik"
}
Response 201
{
    "success": true,
    "message": "Produk berhasil ditambahkan",
    "data": {
        "id": 4,
        "name": "Monitor LG 24 inch",
        "price": "2800000.00",
        "stock": 5,
        "category": "Elektronik",
        "created_at": "...",
        "updated_at": "..."
    }
}
Response 422 (validasi gagal)
{
    "message": "The name field is required.",
    "errors": {
        "name": ["The name field is required."],
        "price": ["The price field is required."]
    }
}
5

PUT — Update Produk

Request — Body → raw → JSON
PUT http://127.0.0.1:8000/api/products/4

{
    "name": "Monitor LG 24 inch IPS",
    "price": 2600000,
    "stock": 8,
    "category": "Elektronik"
}
Response 200
{
    "success": true,
    "message": "Produk berhasil diperbarui",
    "data": {
        "id": 4,
        "name": "Monitor LG 24 inch IPS",
        "price": "2600000.00",
        "stock": 8,
        "category": "Elektronik",
        ...
    }
}
6

DELETE — Hapus Produk

Request
DELETE http://127.0.0.1:8000/api/products/4
Response 200
{
    "success": true,
    "message": "Produk berhasil dihapus"
}
7

Ringkasan File yang Dibuat

  • database/migrations/xxxx_create_products_table.php
  • database/seeders/ProductSeeder.php
  • database/seeders/DatabaseSeeder.php (diedit)
  • app/Models/Product.php
  • app/Http/Controllers/ProductController.php
  • routes/api.php (v10: diedit / v11: dibuat via install:api)
Urutan Perintah Artisan
# 1. Buat migration
php artisan make:migration create_products_table

# 2. Buat model
php artisan make:model Product

# 3. Buat seeder
php artisan make:seeder ProductSeeder

# 4. Buat controller
php artisan make:controller ProductController

# 5. (Khusus v11) Buat routes/api.php
php artisan install:api

# 6. Jalankan migration + seeder
php artisan migrate:fresh --seed

# 7. Jalankan server
php artisan serve