Lewati ke konten

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.

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 berbeda
return ctx.send({ error: 'Conflict' }).conflict();
// Kirim dengan status custom menggunakan .build()
return ctx.send({ message: 'Success' }).build(200);

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 sebagai text/html.
  • String (Plain): Dikirim sebagai text/plain.
  • Buffer/Blob: Dikirim dengan tipe konten binary yang sesuai (jika terdeteksi) atau application/octet-stream.

[!IMPORTANT] ctx.send() tidak menerima objek konfigurasi header. Untuk mengatur response header, kamu harus menggunakan API ctx.headers sebelum memanggil ctx.send().

// Atur header
ctx.headers.set('X-Custom-Header', 'GamanJS-v2');
// Atur beberapa header
ctx.headers.set('Content-Type', 'application/pdf');
return ctx.send(pdfBuffer).ok();

GamanResponseBuilder menyediakan beberapa method semantik untuk HTTP status code yang umum:

MethodStatus CodeDeskripsi
.ok()200Response sukses standar.
.created()201Resource berhasil dibuat.
.accepted()202Request diterima tapi masih diproses.
.noContent()204Sukses tanpa body response.

[!NOTE] Beberapa method error seperti .unauthorized(), .forbidden(), dan .notFound() akan mengganti body response dengan object error standar \{ message: "..." \}, mengabaikan data yang dikirim via ctx.send().

MethodStatus CodeDeskripsi
.badRequest(msg?)400Client side error. Jika msg ada, mengembalikan \{ message, data \}.
.unauthorized(msg?)401Mengembalikan `{ message: msg
.forbidden(msg?)403Mengembalikan `{ message: msg
.notFound(msg?)404Mengembalikan `{ message: msg
.conflict(msg?)409Resource conflict. Jika msg ada, mengembalikan \{ message, data \}.
.unprocessable(errs?, msg?)422Mengembalikan `{ message, errors: errs
.tooManyRequests(msg?)429Mengembalikan `{ message: msg
MethodStatus CodeDeskripsi
.error(msg?)500Mengembalikan `{ message: msg
MethodStatus CodeDeskripsi
.notModified()304Resource tidak berubah (caching).
MethodDeskripsi
.build(status)Finalisasi response dengan HTTP status code tertentu.
export default (ctx) => {
return ctx.send({
success: true,
message: 'User berhasil diperbarui'
}).ok();
}
export default async (ctx) => {
const body = await ctx.json();
if (!body.username) {
return ctx.send({
username: ['Username wajib diisi']
}).unprocessable(null, 'Validasi Gagal');
}
// ... logika
}

Cookie juga dikelola melalui context:

export default (ctx) => {
ctx.cookies.set('session', 'abc-123', { httpOnly: true });
return ctx.send({ message: 'Cookie berhasil diatur' }).ok();
}