Laravel membungkus semua yang dikirim client jadi satu objek Request: method, alamat, query, body, dan header. Yang kamu kembalikan jadi response: status, header, dan body. Bayangin loket perpustakaan. Petugas menerima formulir peminjaman, membaca isiannya satu per satu (request), lalu menyerahkan slip balasan yang sudah dicap "diterima" atau "ditolak" (response dengan status-nya).
🧪 Tebakan cepat: sebuah route mengembalikan array PHP biasa,
return ['title' => 'Laskar Pelangi'];, tanparesponse()->json. Apa yang diterima browser: error, teksArray, atau JSON? Tebak dulu, jawabannya ada di bagian "Bentuk-bentuk response".
Membaca request
Admin Perpustakaan menambah buku lewat POST /books, yang dijawab BookController@store:
POST /books?draft=1 HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/json
{"title": "Ronggeng Dukuh Paruk", "author": "Ahmad Tohari"}
use Illuminate\Http\Request;
public function store(Request $request)
{
$book = [
'id' => 4,
'title' => $request->input('title'),
'author' => $request->input('author'),
'stock' => $request->input('stock', 1),
];
return response()->json($book, 201);
}
Request $requestdi parameter method: Laravel mengisinya sendiri dengan request yang sedang masuk. Barisuse Illuminate\Http\Request;wajib ada di atas file.$request->input('title')mengambil satu field dari body (atau dari query).$request->input('stock', 1): kalaustockgak dikirim, pakai nilai bawaan1.response()->json($book, 201)menjawab JSON dengan status201 Created.
Ini nilai tiap pemanggilan untuk request di atas:
| Pemanggilan | Hasilnya |
|---|---|
$request->method() |
'POST' |
$request->path() |
'books' |
$request->input('title') |
'Ronggeng Dukuh Paruk' |
$request->input('stock', 1) |
1, karena gak dikirim |
$request->query('draft') |
'1', cuma dari query string |
$request->only(['title', 'author']) |
['title' => 'Ronggeng Dukuh Paruk', 'author' => 'Ahmad Tohari'] |
$request->all() |
semua field: title, author, dan draft |
$request->title |
'Ronggeng Dukuh Paruk', cara singkat |
Jawabannya: 201 Created dengan {"id":4,"title":"Ronggeng Dukuh Paruk","author":"Ahmad Tohari","stock":1}. Nama field-nya peka huruf besar: input('Title') menghasilkan null.
Laravel cuma membaca body JSON kalau header-nya Content-Type: application/json. Tanpa header itu, input('title') juga null. Soal header ini sudah dibahas di track API, pelajaran Request & Response.
Bentuk-bentuk response
Apa pun yang di-return diubah Laravel jadi response:
| Yang kamu return | Status | Yang diterima client |
|---|---|---|
'Halo' |
200 OK |
teks, Content-Type: text/html; charset=UTF-8 |
['title' => 'Laskar Pelangi'] |
200 OK |
JSON {"title":"Laskar Pelangi"} |
response()->json($book, 201) |
201 Created |
JSON |
response()->noContent() |
204 No Content |
tanpa body |
redirect()->route('books.show', ['book' => 4]) |
302 Found |
header Location: http://127.0.0.1:8000/books/4 |
view('books.index', [...]) |
200 OK |
HTML dari Blade, di pelajaran berikutnya |
abort(404) |
404 Not Found |
halaman Not Found |
Array diubah jadi JSON dengan Content-Type: application/json, status 200. Itu jawaban tebakannya. response()->json tetap dipakai kalau kamu butuh status lain atau ingin terlihat jelas bahwa jawabannya JSON.
Redirect gak membawa data: browser langsung membuka alamat di Location. Header tambahan dipasang dengan ->header(...), misalnya response()->json($book)->header('Cache-Control', 'no-cache').
Status yang sering kamu temui
Arti tiap kelompok status sudah dibahas di track API. Di Laravel, ini yang paling sering muncul: 200 dan 201 berhasil, 204 berhasil tanpa body, 302 redirect, 404 gak ketemu, 405 method salah, 419 ditolak penjaga CSRF, 422 input gak lolos validasi (pelajaran Validasi), dan 500 error di kodemu.
419 | Page Expired sering bikin bingung. Route di routes/web.php menolak POST, PUT, dan DELETE dari luar app-mu. Request dari halamanmu sendiri lolos, karena browser mengirim header Sec-Fetch-Site: same-origin atau form-nya membawa token @csrf. Request dari curl atau Postman gak membawa keduanya, jadi ditolak. Route API di routes/api.php gak memakai penjaga ini.
Latihan: POST /register
Latihannya sama bentuknya dengan store di atas: route POST /register membaca name dan email dari request, lalu menjawab 201 dengan {"name": ..., "email": ..., "status": "registered"}.
Saat kamu menekan Jalankan, route-nya dipanggil dengan body kosong. $request->input(...) memberi null untuk field yang gak dikirim, jadi output-nya POST /register → 201 lalu {"name":null,"email":null,"status":"registered"}. Pemeriksanya juga mengirim {"name": "Sinta", "email": "[email protected]"} dan mengharapkan nama dan email itu kembali, persis.
⚠️ Jebakan yang sering ketemu
- Menulis nilainya sendiri.
'name' => 'Sinta'lolos sekali, tapi gagal untuk pendaftar lain. Ambil dari$request->input('name'). - Lupa
201.response()->json([...])tanpa angka kedua selalu200. - Lupa
Request $requestatau barisuse-nya. Tanpa parameter itu, gak ada objek request yang bisa dibaca. 419saat mencoba dengan curl. Itu penjaga CSRF, bukan bug di route-mu.
TL;DR: Tulis Request $request di parameter method dan Laravel mengisinya. input('nama') membaca body atau query (input('nama', bawaan) untuk nilai bawaan), query() cuma query string, only([...]) beberapa field, all() semuanya. Body JSON cuma terbaca dengan Content-Type: application/json. Yang di-return jadi response: string jadi HTML, array jadi JSON, response()->json($data, 201) untuk JSON dengan status lain, noContent() untuk 204, redirect()->route(...) untuk 302. POST dari luar app ke routes/web.php dijawab 419.