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:
GETuntuk mengambil data,POSTuntuk menambah,PUTuntuk mengubah, danDELETEuntuk 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).
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 ✓ | |
1. Setup Project
Buat Project Laravel Baru
Buka terminal, jalankan perintah berikut:
composer create-project laravel/laravel products-api
cd products-api
php artisan serve
# Buka: http://127.0.0.1:8000
Konfigurasi Database di .env
Buat database bernama products_api di phpMyAdmin atau MySQL, lalu edit file .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=products_api
DB_USERNAME=root
DB_PASSWORD=
2. Migration & Seeder
Buat Migration
php artisan make:migration create_products_table
Buka file yang muncul di database/migrations/, lalu isi seperti ini:
<?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');
}
};
php artisan migrate
Seeder — Data Dummy (Opsional)
php artisan make:seeder ProductSeeder
<?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(),
],
]);
}
}
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
ProductSeeder::class,
]);
}
}
php artisan migrate:fresh --seed
3. Model
Buat Model Product
php artisan make:model Product
Edit file 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
Buat Controller
php artisan make:controller ProductController
Isi ProductController — 5 Method CRUD
Buka app/Http/Controllers/ProductController.php, ganti semua isinya dengan kode berikut:
<?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
Daftar Endpoint
| Method | URL | Fungsi |
|---|---|---|
| GET | /api/products | Ambil semua produk |
| GET | /api/products/{id} | Ambil satu produk |
| POST | /api/products | Tambah produk |
| PUT | /api/products/{id} | Update produk |
| DELETE | /api/products/{id} | Hapus produk |
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']);
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
Header yang Wajib Ditambahkan
Setiap request di Postman, tambahkan header ini agar response selalu JSON:
Accept : application/json
Content-Type : application/json
GET — Ambil Semua Produk
GET http://127.0.0.1:8000/api/products
{
"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"
},
{ ... }
]
}
GET — Ambil Satu Produk
GET http://127.0.0.1:8000/api/products/1
{
"success": true,
"data": {
"id": 1,
"name": "Laptop ASUS",
"price": "7500000.00",
"stock": 10,
"category": "Elektronik",
"created_at": "...",
"updated_at": "..."
}
}
{
"success": false,
"message": "Produk tidak ditemukan"
}
POST — Tambah Produk Baru
POST http://127.0.0.1:8000/api/products
{
"name": "Monitor LG 24 inch",
"price": 2800000,
"stock": 5,
"category": "Elektronik"
}
{
"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": "..."
}
}
{
"message": "The name field is required.",
"errors": {
"name": ["The name field is required."],
"price": ["The price field is required."]
}
}
PUT — Update Produk
PUT http://127.0.0.1:8000/api/products/4
{
"name": "Monitor LG 24 inch IPS",
"price": 2600000,
"stock": 8,
"category": "Elektronik"
}
{
"success": true,
"message": "Produk berhasil diperbarui",
"data": {
"id": 4,
"name": "Monitor LG 24 inch IPS",
"price": "2600000.00",
"stock": 8,
"category": "Elektronik",
...
}
}
DELETE — Hapus Produk
DELETE http://127.0.0.1:8000/api/products/4
{
"success": true,
"message": "Produk berhasil dihapus"
}
Ringkasan File yang Dibuat
database/migrations/xxxx_create_products_table.phpdatabase/seeders/ProductSeeder.phpdatabase/seeders/DatabaseSeeder.php(diedit)app/Models/Product.phpapp/Http/Controllers/ProductController.phproutes/api.php(v10: diedit / v11: dibuat viainstall:api)
# 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