Responses
Di GamanJS v2, cara utama untuk mengirim response adalah menggunakan ctx.send(). Method ini menyediakan interface yang lancar (fluent interface) untuk membuat dan menyesuaikan HTTP response dengan mudah.
Penggunaan Dasar
Section titled “Penggunaan Dasar”Method ctx.send() menerima satu argumen opsional: data. Method ini mengembalikan GamanResponseBuilder yang bisa kamu gunakan untuk memfinalisasi response.
// Kirim JSON dengan status 200 (default)return ctx.send({ name: 'GamanJS', version: '2.0' }).ok();
// Kirim dengan status yang berbedareturn ctx.send({ error: 'Conflict' }).conflict();
// Kirim dengan status custom menggunakan .build()return ctx.send({ message: 'Success' }).build(200);Tipe Data yang Didukung
Section titled “Tipe Data yang Didukung”ctx.send() secara otomatis mendeteksi tipe konten berdasarkan data yang diberikan:
- Object/Array: Dikirim sebagai
application/json. - String (HTML): Jika string dimulai dengan
<dan diakhiri dengan>, dikirim sebagaitext/html. - String (Plain): Dikirim sebagai
text/plain. - Buffer/Blob: Dikirim dengan tipe konten binary yang sesuai (jika terdeteksi) atau
application/octet-stream.
Response Headers
Section titled “Response Headers”[!IMPORTANT]
ctx.send()tidak menerima objek konfigurasi header. Untuk mengatur response header, kamu harus menggunakan APIctx.headerssebelum memanggilctx.send().
// Atur headerctx.headers.set('X-Custom-Header', 'GamanJS-v2');
// Atur beberapa headerctx.headers.set('Content-Type', 'application/pdf');
return ctx.send(pdfBuffer).ok();Method GamanResponseBuilder
Section titled “Method GamanResponseBuilder”GamanResponseBuilder menyediakan beberapa method semantik untuk HTTP status code yang umum:
Response Sukses (2xx)
Section titled “Response Sukses (2xx)”| Method | Status Code | Deskripsi |
|---|---|---|
.ok() | 200 | Response sukses standar. |
.created() | 201 | Resource berhasil dibuat. |
.accepted() | 202 | Request diterima tapi masih diproses. |
.noContent() | 204 | Sukses tanpa body response. |
Response Error Client (4xx)
Section titled “Response Error Client (4xx)”[!NOTE] Beberapa method error seperti
.unauthorized(),.forbidden(), dan.notFound()akan mengganti body response dengan object error standar\{ message: "..." \}, mengabaikan data yang dikirim viactx.send().
| Method | Status Code | Deskripsi |
|---|---|---|
.badRequest(msg?) | 400 | Client side error. Jika msg ada, mengembalikan \{ message, data \}. |
.unauthorized(msg?) | 401 | Mengembalikan `{ message: msg |
.forbidden(msg?) | 403 | Mengembalikan `{ message: msg |
.notFound(msg?) | 404 | Mengembalikan `{ message: msg |
.conflict(msg?) | 409 | Resource conflict. Jika msg ada, mengembalikan \{ message, data \}. |
.unprocessable(errs?, msg?) | 422 | Mengembalikan `{ message, errors: errs |
.tooManyRequests(msg?) | 429 | Mengembalikan `{ message: msg |
Response Error Server (5xx)
Section titled “Response Error Server (5xx)”| Method | Status Code | Deskripsi |
|---|---|---|
.error(msg?) | 500 | Mengembalikan `{ message: msg |
Redirection & Lainnya (3xx)
Section titled “Redirection & Lainnya (3xx)”| Method | Status Code | Deskripsi |
|---|---|---|
.notModified() | 304 | Resource tidak berubah (caching). |
Status Custom
Section titled “Status Custom”| Method | Deskripsi |
|---|---|
.build(status) | Finalisasi response dengan HTTP status code tertentu. |
Contoh
Section titled “Contoh”Response JSON dengan Pesan Custom
Section titled “Response JSON dengan Pesan Custom”export default (ctx) => { return ctx.send({ success: true, message: 'User berhasil diperbarui' }).ok();}Menangani Kesalahan Validasi
Section titled “Menangani Kesalahan Validasi”export default async (ctx) => { const body = await ctx.json();
if (!body.username) { return ctx.send({ username: ['Username wajib diisi'] }).unprocessable(null, 'Validasi Gagal'); }
// ... logika}Mengatur Cookie
Section titled “Mengatur Cookie”Cookie juga dikelola melalui context:
export default (ctx) => { ctx.cookies.set('session', 'abc-123', { httpOnly: true }); return ctx.send({ message: 'Cookie berhasil diatur' }).ok();}