Laravel API: Cara Membuat REST API dari Nol
Laravel merupakan salah satu framework PHP yang populer untuk membangun aplikasi web dan backend. Selain digunakan untuk membuat aplikasi berbasis server-side rendering, Laravel juga dapat digunakan untuk membangun REST API yang melayani komunikasi antara aplikasi web, mobile, maupun layanan lainnya.
Dalam tutorial ini, kita akan membuat REST API Laravel dari nol, mulai dari instalasi project, konfigurasi database, pembuatan model dan migration, pembuatan controller API, routing, validasi request, hingga pengujian endpoint.
Tutorial ini cocok untuk pemula yang ingin memahami cara membuat Laravel REST API dengan struktur yang rapi dan mudah dikembangkan.
Apa Itu REST API?
REST API adalah antarmuka yang memungkinkan aplikasi saling berkomunikasi melalui protokol HTTP.
Dalam REST API, data biasanya direpresentasikan dalam format JSON. Setiap resource memiliki endpoint tertentu dan dapat dimanipulasi menggunakan HTTP method seperti:
GETuntuk mengambil data.POSTuntuk membuat data baru.PUTatauPATCHuntuk memperbarui data.DELETEuntuk menghapus data.
Sebagai contoh, jika kita memiliki resource posts, endpoint API dapat dibuat seperti berikut:
GET /api/posts
POST /api/posts
GET /api/posts/{id}
PUT /api/posts/{id}
DELETE /api/posts/{id}
Pada tutorial ini, kita akan membuat REST API sederhana untuk mengelola data posts.
Persiapan Sebelum Membuat Laravel API
Pastikan environment pengembangan sudah memiliki beberapa kebutuhan berikut:
- PHP yang kompatibel dengan versi Laravel yang digunakan.
- Composer.
- Database seperti MySQL atau MariaDB.
- Terminal atau command line.
- Code editor.
Periksa versi PHP:
php -v
Periksa Composer:
composer -V
Jika kedua perintah tersebut berhasil dijalankan, environment dasar sudah siap digunakan.
Membuat Project Laravel Baru
Buat project Laravel menggunakan Composer:
composer create-project laravel/laravel laravel-api
Masuk ke direktori project:
cd laravel-api
Jalankan development server:
php artisan serve
Secara default, aplikasi dapat diakses melalui:
http://127.0.0.1:8000
Jika halaman Laravel berhasil dibuka, berarti project sudah berhasil dibuat.
Konfigurasi Database Laravel
Laravel menggunakan file .env untuk menyimpan konfigurasi environment seperti database.
Buka file:
.env
Kemudian sesuaikan konfigurasi database.
Contoh menggunakan MySQL:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_api
DB_USERNAME=root
DB_PASSWORD=
Buat database laravel_api terlebih dahulu menggunakan MySQL atau database management tool yang Anda gunakan.
Setelah database dikonfigurasi, jalankan migration bawaan Laravel:
php artisan migrate
Jika tidak muncul error, Laravel sudah berhasil terhubung dengan database.
Membuat Model dan Migration Post
Sekarang kita akan membuat model Post sekaligus migration.
Jalankan:
php artisan make:model Post -m
Perintah tersebut menghasilkan model Post dan file migration untuk tabel posts.
Buka file migration yang berada di:
database/migrations/
Kemudian sesuaikan struktur tabel:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->timestamps();
});
Struktur tersebut memiliki tiga field utama:
idsebagai primary key.titleuntuk judul artikel.contentuntuk isi artikel.created_atdanupdated_atdaritimestamps().
Jalankan migration:
php artisan migrate
Laravel kemudian membuat tabel posts di database.
Mengatur Model Post
Buka:
app/Models/Post.php
Pada versi Laravel yang menggunakan mass assignment protection melalui $fillable, tambahkan field yang boleh diisi secara mass assignment:
protected $fillable = [
'title',
'content',
];
Model kemudian menjadi seperti:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = [
'title',
'content',
];
}
Dengan konfigurasi tersebut, title dan content dapat digunakan ketika membuat data menggunakan Post::create().
Membuat API Controller
Buat controller khusus API:
php artisan make:controller Api/PostController --api
Laravel akan membuat controller di:
app/Http/Controllers/Api/PostController.php
Controller ini nantinya digunakan untuk menangani operasi CRUD.
Membuat Route API
Pada Laravel versi terbaru, route API perlu diaktifkan jika project belum memiliki file routes/api.php.
Gunakan:
php artisan install:api
Perintah tersebut dapat memasang kebutuhan API dan membuat konfigurasi route API pada project.
Setelah tersedia, buka:
routes/api.php
Tambahkan route resource:
<?php
use App\Http\Controllers\Api\PostController;
use Illuminate\Support\Facades\Route;
Route::apiResource('posts', PostController::class);
Dengan apiResource(), Laravel membuat route CRUD API tanpa route HTML seperti create dan edit.
Periksa route yang tersedia:
php artisan route:list --path=api
Anda akan mendapatkan endpoint seperti:
GET /api/posts
POST /api/posts
GET /api/posts/{post}
PUT /api/posts/{post}
PATCH /api/posts/{post}
DELETE /api/posts/{post}
Membuat Endpoint GET untuk Semua Post
Buka controller:
app/Http/Controllers/Api/PostController.php
Tambahkan implementasi method index():
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\JsonResponse;
class PostController extends Controller
{
public function index(): JsonResponse
{
$posts = Post::latest()->get();
return response()->json([
'success' => true,
'data' => $posts,
]);
}
}
Endpoint tersebut dapat diakses melalui:
GET /api/posts
Jika belum ada data, response kurang lebih akan berbentuk:
{
"success": true,
"data": []
}
Membuat Endpoint POST
Selanjutnya kita membuat endpoint untuk menambahkan post baru.
Tambahkan method store():
use Illuminate\Http\Request;
Kemudian:
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'content' => ['required', 'string'],
]);
$post = Post::create($validated);
return response()->json([
'success' => true,
'message' => 'Post berhasil dibuat.',
'data' => $post,
], 201);
}
Request JSON yang dikirim ke endpoint:
{
"title": "Belajar Laravel API",
"content": "Ini adalah contoh post dari REST API Laravel."
}
Endpoint:
POST /api/posts
Jika berhasil, server akan mengembalikan HTTP status 201 Created.
Validasi Request API
Validasi sangat penting untuk memastikan data yang masuk sesuai dengan kebutuhan aplikasi.
Contoh validasi:
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'content' => ['required', 'string'],
]);
Jika title atau content tidak dikirim, Laravel akan menghasilkan response validasi secara otomatis.
Contohnya, request tanpa title dapat menghasilkan response JSON seperti:
{
"message": "The title field is required.",
"errors": {
"title": [
"The title field is required."
]
}
}
Validasi sebaiknya selalu dilakukan di sisi server meskipun frontend juga melakukan validasi.
Membuat Endpoint GET Berdasarkan ID
Untuk mengambil satu post, implementasikan method show():
public function show(Post $post): JsonResponse
{
return response()->json([
'success' => true,
'data' => $post,
]);
}
Endpoint:
GET /api/posts/{id}
Contoh:
GET /api/posts/1
Laravel menggunakan route model binding sehingga parameter {post} dapat langsung diterjemahkan menjadi instance model Post.
Jika data dengan ID tersebut tidak ditemukan, Laravel akan menghasilkan response 404 Not Found.
Membuat Endpoint PUT untuk Update
Tambahkan method update():
public function update(Request $request, Post $post): JsonResponse
{
$validated = $request->validate([
'title' => ['sometimes', 'required', 'string', 'max:255'],
'content' => ['sometimes', 'required', 'string'],
]);
$post->update($validated);
return response()->json([
'success' => true,
'message' => 'Post berhasil diperbarui.',
'data' => $post->fresh(),
]);
}
Request:
PUT /api/posts/1
Dengan body JSON:
{
"title": "Judul Post yang Diperbarui",
"content": "Isi post yang telah diperbarui."
}
Membuat Endpoint DELETE
Untuk menghapus data, tambahkan method destroy():
public function destroy(Post $post): JsonResponse
{
$post->delete();
return response()->json([
'success' => true,
'message' => 'Post berhasil dihapus.',
]);
}
Endpoint:
DELETE /api/posts/1
Jika berhasil, API mengembalikan response:
{
"success": true,
"message": "Post berhasil dihapus."
}
Controller Lengkap
Setelah semua method dibuat, controller dapat disusun seperti berikut:
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index(): JsonResponse
{
$posts = Post::latest()->get();
return response()->json([
'success' => true,
'data' => $posts,
]);
}
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'content' => ['required', 'string'],
]);
$post = Post::create($validated);
return response()->json([
'success' => true,
'message' => 'Post berhasil dibuat.',
'data' => $post,
], 201);
}
public function show(Post $post): JsonResponse
{
return response()->json([
'success' => true,
'data' => $post,
]);
}
public function update(Request $request, Post $post): JsonResponse
{
$validated = $request->validate([
'title' => ['sometimes', 'required', 'string', 'max:255'],
'content' => ['sometimes', 'required', 'string'],
]);
$post->update($validated);
return response()->json([
'success' => true,
'message' => 'Post berhasil diperbarui.',
'data' => $post->fresh(),
]);
}
public function destroy(Post $post): JsonResponse
{
$post->delete();
return response()->json([
'success' => true,
'message' => 'Post berhasil dihapus.',
]);
}
}
Menguji Laravel REST API
Setelah API selesai dibuat, Anda dapat mengujinya menggunakan Postman, Insomnia, Bruno, curl, atau HTTP client lainnya.
Untuk mengambil seluruh post menggunakan curl:
curl http://127.0.0.1:8000/api/posts
Untuk membuat post:
curl -X POST http://127.0.0.1:8000/api/posts \
-H "Content-Type: application/json" \
-d '{"title":"Belajar Laravel API","content":"Membuat REST API dari Laravel."}'
Untuk mengambil satu post:
curl http://127.0.0.1:8000/api/posts/1
Untuk memperbarui post:
curl -X PUT http://127.0.0.1:8000/api/posts/1 \
-H "Content-Type: application/json" \
-d '{"title":"Laravel REST API","content":"Konten telah diperbarui."}'
Untuk menghapus post:
curl -X DELETE http://127.0.0.1:8000/api/posts/1
Struktur API yang Kita Buat
Setelah mengikuti tutorial, struktur sederhananya menjadi:
laravel-api/
├── app/
│ ├── Http/
│ │ └── Controllers/
│ │ └── Api/
│ │ └── PostController.php
│ └── Models/
│ └── Post.php
├── database/
│ └── migrations/
│ └── xxxx_xx_xx_xxxxxx_create_posts_table.php
├── routes/
│ └── api.php
└── .env
Arsitektur tersebut sudah cukup untuk aplikasi API sederhana dan dapat dikembangkan lebih lanjut.
Praktik Terbaik Saat Membuat Laravel API
REST API yang digunakan dalam aplikasi production membutuhkan lebih dari sekadar CRUD. Beberapa praktik yang sebaiknya diterapkan antara lain:
Gunakan API Resource
Untuk API yang lebih terstruktur, gunakan Laravel API Resource agar format response tidak langsung bergantung pada struktur model database.
Buat resource:
php artisan make:resource PostResource
Kemudian resource dapat digunakan untuk menentukan field yang boleh dikirimkan ke client.
Gunakan Form Request untuk Validasi Kompleks
Jika validasi mulai panjang, pisahkan validasi dari controller menggunakan Form Request:
php artisan make:request StorePostRequest
Pendekatan ini membuat controller lebih bersih dan memudahkan pemeliharaan kode.
Gunakan Pagination
Jangan mengembalikan ribuan data sekaligus menggunakan get().
Untuk data yang besar, gunakan pagination:
$posts = Post::latest()->paginate(10);
Dengan pagination, client dapat mengambil data secara bertahap.
Gunakan Authentication
Jika API tidak bersifat publik, endpoint sebaiknya dilindungi autentikasi.
Laravel menyediakan beberapa pendekatan autentikasi API, termasuk Laravel Sanctum yang cocok untuk banyak aplikasi berbasis SPA, mobile, maupun token API sederhana.
Contoh middleware:
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('posts', PostController::class);
});
Pastikan metode autentikasi yang digunakan disesuaikan dengan arsitektur aplikasi.
Gunakan HTTP Status Code yang Tepat
Response API sebaiknya menggunakan status code yang sesuai.
Beberapa status code yang umum:
200 OKuntuk request berhasil.201 Createdketika resource baru berhasil dibuat.204 No Contentketika operasi berhasil tetapi tidak membutuhkan response body.400 Bad Requestuntuk request yang tidak valid secara umum.401 Unauthorizedketika autentikasi diperlukan atau gagal.403 Forbiddenketika user tidak memiliki izin.404 Not Foundketika resource tidak ditemukan.422 Unprocessable Contentuntuk kegagalan validasi data.
Penggunaan status code yang konsisten membuat API lebih mudah digunakan oleh frontend dan aplikasi client lainnya.
Keamanan Laravel API
API yang sudah dapat digunakan bukan berarti otomatis aman untuk production.
Beberapa hal yang perlu diperhatikan:
- Validasi semua input dari client.
- Jangan mengembalikan data sensitif melalui JSON.
- Gunakan authentication untuk endpoint privat.
- Terapkan authorization untuk memastikan user hanya dapat mengakses resource yang diperbolehkan.
- Gunakan HTTPS pada production.
- Batasi request dengan rate limiting jika diperlukan.
- Jangan menyimpan credential atau secret API di source code.
- Gunakan environment variable untuk konfigurasi sensitif.
- Perbarui Laravel dan dependency secara berkala.
Jangan menganggap validasi request sebagai pengganti authorization. Validasi memastikan data memiliki format yang benar, sedangkan authorization menentukan apakah user memiliki hak untuk melakukan suatu tindakan.
Kesalahan yang Sering Terjadi
Route API Tidak Ditemukan
Jika /api/posts menghasilkan 404, periksa apakah route sudah terdaftar:
php artisan route:list --path=api
Pastikan routes/api.php berisi route yang benar dan konfigurasi API sudah tersedia.
Database Connection Error
Periksa konfigurasi:
DB_DATABASE
DB_USERNAME
DB_PASSWORD
DB_HOST
DB_PORT
Setelah mengubah .env, bersihkan cache konfigurasi jika diperlukan:
php artisan config:clear
Mass Assignment Error
Jika menggunakan:
Post::create($validated);
pastikan field yang diizinkan sudah ditentukan pada model:
protected $fillable = [
'title',
'content',
];
API Mengembalikan HTML
API seharusnya mengembalikan JSON. Pastikan request menggunakan header yang sesuai dan endpoint memang diarahkan ke route API.
Contoh header:
Accept: application/json
Untuk request yang memiliki body JSON, gunakan:
Content-Type: application/json
Kesimpulan
Membuat Laravel REST API dari nol dapat dilakukan dengan alur yang cukup sederhana: buat project Laravel, konfigurasi database, buat model dan migration, siapkan API controller, definisikan route, tambahkan validasi, lalu uji endpoint CRUD.
Dengan apiResource(), Laravel membantu mengurangi boilerplate routing untuk operasi CRUD. Setelah API dasar selesai, aplikasi dapat dikembangkan menggunakan API Resource, Form Request, pagination, authentication, authorization, rate limiting, dan berbagai fitur lain sesuai kebutuhan.
REST API yang dirancang dengan struktur endpoint, validasi, response, dan keamanan yang konsisten akan lebih mudah digunakan oleh frontend web, aplikasi mobile, maupun service lain.
FAQ
Apakah Laravel cocok untuk membuat REST API?
Ya. Laravel menyediakan routing API, validation, Eloquent ORM, middleware, authentication, API Resource, dan berbagai komponen lain yang memudahkan pengembangan REST API.
Apa perbedaan apiResource() dan resource()?
apiResource() dirancang untuk API dan tidak membuat route halaman create serta edit. Sementara resource() membuat route resource lengkap yang umumnya digunakan untuk aplikasi web berbasis HTML.
Apakah Laravel API harus menggunakan database MySQL?
Tidak. Laravel mendukung beberapa database, sehingga database dapat dipilih sesuai kebutuhan aplikasi dan environment deployment.
Apakah Laravel API bisa digunakan untuk aplikasi mobile?
Bisa. REST API Laravel dapat menjadi backend untuk aplikasi Android, iOS, maupun aplikasi mobile lintas platform selama client dapat berkomunikasi menggunakan HTTP/HTTPS.
Apakah Laravel API harus menggunakan Sanctum?
Tidak semua API membutuhkan Sanctum. Namun, jika API memiliki endpoint privat yang membutuhkan autentikasi, Sanctum merupakan salah satu opsi yang dapat dipertimbangkan sesuai kebutuhan arsitektur aplikasi.

