Membangun Response JSON
Penjelasan
Sama seperti body request, response JSON di Rocket cukup dibungkus `Json(...)` sebagai nilai balik fungsi handler — Rocket otomatis meng-handle serialisasi dan header `Content-Type: application/json`, asalkan struct yang dibungkus meng-implementasi `Serialize`. Untuk mengontrol status code selain default (200 untuk GET, 200 untuk semua handler kecuali dinyatakan lain), Rocket menyediakan `rocket::response::status::Custom<T>` yang membungkus status code dan body sekaligus, mirip peran tuple `(StatusCode, Json<T>)` di Axum. Ada juga shortcut seperti `status::Created<T>` khusus untuk 201. Karena tipe balik fungsi Rocket harus meng-implementasi trait `Responder`, kombinasi `status::Custom<Json<T>>` valid karena Rocket sudah menyediakan implementasi `Responder` untuk pasangan tipe ini secara bawaan.
Contoh Konsep
#[macro_use] extern crate rocket;
use rocket::http::Status;
use rocket::response::status;
use rocket::serde::{Serialize, json::Json};
#[derive(Serialize)]
#[serde(crate = "rocket::serde")]
struct Note {
id: u32,
title: String,
}
#[get("/notes/1")]
fn get_note() -> Json<Note> {
Json(Note { id: 1, title: "Belajar Rocket".to_string() })
}
#[post("/notes")]
fn create_note() -> status::Custom<Json<Note>> {
let note = Note { id: 2, title: "Catatan baru".to_string() };
status::Custom(Status::Created, Json(note))
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![get_note, create_note])
}
Praktikum
Buat handler `get_user` yang mengembalikan `Json<User>` berisi data user dummy dengan `id` dan `name`.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Kalau kamu sering membuat response 201 Created, `rocket::response::status::Created<T>` lebih ringkas daripada `status::Custom(Status::Created, ...)` karena otomatis menambahkan header `Location` juga — cocok dipakai kalau endpoint create resource-mu ingin mengikuti konvensi REST yang lebih lengkap.