#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()))
}
```