Rustでwebアプリを実装して勉強 その4 - jsonを返すAPIの実装

Rust初心者が勉強したことを記録する備忘録。

今日やった事

今日やったことをプルリクにしておくと参照するのが楽なことに気づいた。

github.com

JSONシリアライズ/デシリアライズ

serde_json一択です。
引用: isucon7予選のアプリをRustに移植したから解説するね

という記事を見たので serde_json を使ってみた。

serde_json の使い方

jsonにしたいstructにSerialize, Deserializeをつける。

#[derive(Queryable, Serialize, Deserialize)]
pub struct Post {
    pub id: i32,
    pub title: String,
    pub body: String,
    pub published: bool,
}

あとは serde_json::to_string や serde_json::from_str を呼べばいい。

let post = Post { ...(略) };

// struct -> json
let json = serde_json::to_string(&post).unwrap();

// json -> struct
let json_post: Post = serde_json::from_str(&json).unwrap();

ルーティング

ルーティングは 前方一致 なので、 "/posts/{id}" より前に書く必要がある。

 cfg.route("/posts", web::get().to(posts::index))
+    .route("/posts/{id}.json", web::get().to(posts::show_json))
     .route("/posts/{id}", web::get().to(posts::show))

本当は content-type などを考慮して良い感じに書くべきなんだろうけど、今日は疲れたので雑に別の関数にした。

次にやりたいこと

  • SQLに関する処理をModelに移す(もしくはRepositoryを作る)
  • テストコードを書く
  • jsonを返すように直す
  • テンプレートエンジンを使ってhtmlを返す
  • テスト環境の改善(コードのリファクタリングトランザクション周りの設定など)
  • Dockerで動くように直す
  • Herokuで動かす