Study
Rocket

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`.

Editor Latihan

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.