Tutorial Laravel: Membuat REST API Sederhana untuk Aplikasi Mobile
Kalau kamu mau bikin aplikasi mobile (Flutter, React Native) tapi bingung bagaimana caranya aplikasi itu mengambil dan menyimpan data, jawabannya hampir selalu: REST API. REST API adalah jembatan antara aplikasi dan database. Di tutorial ini kita bangun API produk lengkap dari nol — dengan kode yang bisa langsung kamu copy-paste.
1. Persiapan: Buat Proyek Laravel Baru
Pastikan PHP 8.2+ dan Composer sudah terinstall. Lalu buat proyek baru dan masuk ke foldernya:
composer create-project laravel/laravel api-toko cd api-toko
Atur koneksi database di file .env. Untuk belajar, SQLite paling gampang — cukup buat file database kosong lalu arahkan .env ke sana:
touch database/database.sqlite # di .env: DB_CONNECTION=sqlite
2. Buat Migration untuk Tabel Produk
Jalankan perintah artisan untuk membuat migration:
php artisan make:migration create_produks_table
Buka file migration yang baru dibuat di database/migrations, lalu isi method up() 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('produks', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->decimal('harga', 12, 2);
$table->integer('stok')->default(0);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('produks');
}
};
Jalankan migration-nya:
php artisan migrate
3. Buat Model Produk
Jalankan:
php artisan make:model Produk
Buka app/Models/Produk.php dan tambahkan $fillable supaya field-nya boleh diisi massal:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Produk extends Model
{
protected $fillable = ['nama', 'harga', 'stok'];
}
4. Tulis Controller Lengkap
Buat controller dengan perintah ini:
php artisan make:controller ProdukController
Buka app/Http/Controllers/ProdukController.php dan ganti seluruh isinya dengan kode berikut. Lima method ini menangani semua operasi CRUD, lengkap dengan validasi:
<?php
namespace App\Http\Controllers;
use App\Models\Produk;
use Illuminate\Http\Request;
class ProdukController extends Controller
{
// GET /api/produk — tampilkan semua produk
public function index()
{
return response()->json(Produk::all());
}
// POST /api/produk — tambah produk baru
public function store(Request $request)
{
$validated = $request->validate([
'nama' => 'required|string|max:255',
'harga' => 'required|numeric|min:0',
'stok' => 'required|integer|min:0',
]);
$produk = Produk::create($validated);
return response()->json($produk, 201);
}
// GET /api/produk/{id} — tampilkan satu produk
public function show(Produk $produk)
{
return response()->json($produk);
}
// PUT /api/produk/{id} — ubah produk
public function update(Request $request, Produk $produk)
{
$validated = $request->validate([
'nama' => 'sometimes|string|max:255',
'harga' => 'sometimes|numeric|min:0',
'stok' => 'sometimes|integer|min:0',
]);
$produk->update($validated);
return response()->json($produk);
}
// DELETE /api/produk/{id} — hapus produk
public function destroy(Produk $produk)
{
$produk->delete();
return response()->json(['message' => 'Produk dihapus']);
}
};
Perhatikan Produk $produk di parameter method: itu fitur route model binding — Laravel otomatis mencari produk berdasarkan ID di URL, dan mengembalikan error 404 kalau tidak ketemu. Kamu tidak perlu menulis Produk::findOrFail() manual.
5. Daftarkan Route API
Buka routes/api.php dan tambahkan:
use App\Http\Controllers\ProdukController;
Route::apiResource('produk', ProdukController::class);
Satu baris itu otomatis membuat 5 endpoint. Cek dengan:
php artisan route:list --path=api
Kamu akan melihat: GET /api/produk, POST /api/produk, GET /api/produk/{produk}, PUT/PATCH /api/produk/{produk}, dan DELETE /api/produk/{produk}.
6. Tes Semua Endpoint
Jalankan server development:
php artisan serve
Lalu tes dari terminal lain dengan curl. Tambah produk baru:
curl -X POST http://localhost:8000/api/produk \
-H "Content-Type: application/json" \
-d '{"nama":"Kopi Susu","harga":15000,"stok":50}'
Lihat semua produk:
curl http://localhost:8000/api/produk
Responsnya berupa JSON seperti ini:
[
{
"id": 1,
"nama": "Kopi Susu",
"harga": "15000.00",
"stok": 50,
"created_at": "2026-10-05T08:00:00.000000Z",
"updated_at": "2026-10-05T08:00:00.000000Z"
}
]
Ubah stok produk id 1, lalu hapus:
curl -X PUT http://localhost:8000/api/produk/1 \
-H "Content-Type: application/json" \
-d '{"stok":45}'
curl -X DELETE http://localhost:8000/api/produk/1
Kalau validasi gagal (misalnya harga dikirim sebagai teks), Laravel otomatis mengembalikan error 422 beserta pesan kesalahannya — aplikasi mobile-mu tinggal menampilkan pesan itu ke pengguna.
7. Bonus: Amankan API dengan Sanctum
API publik boleh diakses siapa saja, tapi endpoint tambah/ubah/hapus sebaiknya butuh login. Laravel Sanctum memberi autentikasi token yang simpel:
composer require laravel/sanctum php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" php artisan migrate
Tambahkan trait HasApiTokens ke model User, lalu lindungi route yang sensitif:
Route::apiResource('produk', ProdukController::class)->except(['index', 'show'])
->middleware('auth:sanctum');
Route::apiResource('produk', ProdukController::class)->only(['index', 'show']);
Alur loginnya: aplikasi mobile mengirim email+password ke endpoint login, server membalas dengan token ($user->createToken('mobile')->plainTextToken), dan setiap request berikutnya menyertakan header Authorization: Bearer TOKEN. Sanctum mengurus sisanya.
Kesimpulan
Sekarang kamu punya API CRUD lengkap: migration, model, controller bervalidasi, route otomatis, cara mengetesnya, plus pengaman token. Pola model–controller–route inilah yang dipakai hampir semua aplikasi modern — backend Laravel menyajikan JSON, frontend (web atau mobile) tinggal mengonsumsinya. Kuasai pola ini sekali, dan kamu bisa membangun backend untuk aplikasi apa pun. Kalau butuh inspirasi aplikasi jadi yang siap dipakai, lihat koleksinya di PecutAigan.
Komentar
Posting Komentar