#Rocket https://rocket.rs/v0.4/guide/responses/ ## 概要 [rocket::response::Responder]が実装されているものはレスポンスとして返却できる。 [rocket::response::Responder]: https://api.rocket.rs/master/rocket/response/trait.Responder.html [rocket::response::Responder]は以下を含めて生成方法を知っている。 - [[HTTP Status]] - [[response header]] また、streamingが適した場合はstreamingで返却する。 ## JSON [[®rocket_contrib]]を使う。 [[serde]]の[serialize::Serialize]トレイトが実装されたTに対し、 `JSON<T>`を指定すればOK。 [serialize::Serialize]: https://docs.serde.rs/serde/trait.Serialize.html ```rust #[derive(Debug, Deserialize, Serialize)] struct RoutesResponse { items: Vec<Route>, } #[get("/routes?<limit>")] fn routes(limit: usize) -> Json<RoutesResponse> { let gtfs = external::gtfsdb::GtfsDb::new(Path::new("hibou.db")).unwrap(); let routes = RouteServiceDb::new(gtfs).fetch().unwrap(); Json(RoutesResponse { items: routes.into_iter().take(limit).collect_vec(), }) } ``` ```shell curl -s "http://localhost:8000/routes?limit=2" | jq . { "items": [ { "route_id": "R010500801000000", ... }, { "route_id": "R010500802000000", ... }, ] } ``` ## エラーハンドリング https://rocket.rs/v0.4/guide/responses/#result [[std.result.Result]]で制御できる。 ```rust use rocket::response::NamedFile; use rocket::response::status::NotFound; #[get("/<file..>")] fn files(file: PathBuf) -> Result<NamedFile, NotFound<String>> { let path = Path::new("static/").join(file); NamedFile::open(&path).map_err(|e| NotFound(e.to_string())) } ```