このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

Rust – Actix Web × JSON 静的ファイルをAPIで返却

Rust

2024.01.19

どもです。

前回「Rust – Actix Web × MongoDB環境をサクッと起動」という記事を書きましたが、公開されている変化のない固定のデータ、所謂マスターデータに関しては、mongoDBの方に保存せずにJSONファイルとしてサーバー上にアップロードし、そちらを読み込みActix WebのAPIとして返却はできないかと調べたところ、容易に行えたのでそちらの備忘録となります。

ソースを先に確認したい方はこちらを参照ください。

Actix Web Static JSON

サーバー構築

今回は準備等は割愛させて頂き、Actix Webの実装を行っていきます。

ソース自体も長くないので、main.rs一つに集約して記述します。まずはUserのstructの作成。

こちらは前回と変わりない形となります。

構造体の定義
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct User {
    id: u32,
    first_name: String,
    last_name: String,
    username: String,
    email: String,
}

JSONファイルを作成していきます。

JSONデータはUserを複数持つ形なので、Userの配列として作成し、user_list.jsonのファイル名でdataフォルダ以下に配置します。(ユーザーデータはchatGPTに作って頂きました。)

今回はデモなので、ユーザーデータとしておりますが、ユーザーデータは個人情報を含むこともあって、この様な形で公開するのは良くないので、本番で行う場合は扱うデータに気をつけてください。

[
    {
        "id": 1,
        "first_name": "daisuke",
        "last_name": "takayama",
        "username": "takayama daisuke",
        "email": "webcyou@webcyou.com"
    },
    {
        "id": 2,
        "first_name": "Haruka",
        "last_name": "Tanaka",
        "username": "haruka_t",
        "email": "haruka.tanaka@example.com"
    },
   ...
]

続いて、JSONファイルの読み込み処理を行うload_users関数となります。

クライアントアプリ開発で、JSONファイルを読み込んでそのデータを処理するアプリを作成したのですが、そのまんま処理が流用できるので良いですね。

File::openでファイルを読み込みます。ファイルが見つからない場合、エラーが発生します。

ファイルの内容を文字列として読み込みます。こちらも読み込み中に問題が発生した場合、エラーが発生します。

読み込んだ文字列をserde_jsonを使用してUser構造体のベクトルにデシリアライズ(パース)します。

User構造体のベクトルを、UserのIDをキーとするHashMapに変換します。これにより、IDに基づいてユーザーを簡単に検索できるようになります。

JSONファイルの読み込みと構造体への変換
use std::fs::File;
use std::io::Read;
use std::collections::HashMap;

fn load_users() -> HashMap<u32, User> {
    let mut file = File::open("data/user_list.json").expect("File not found");
    let mut contents = String::new();
    file.read_to_string(&mut contents).expect("Something went wrong reading the file");
    let users: Vec<User> = serde_json::from_str(&contents).unwrap();
    users.into_iter().map(|user| (user.id, user)).collect()
}

最後は、Actix Webのメイン処理となります。ウェブサーバーを立ち上げ、ユーザーデータの取得を行う機能を提供します。

Actix Webハンドラーの作成
use actix_web::{web, App, HttpResponse, HttpServer, Responder};

async fn get_user(id: web::Path<u32>, data: web::Data<HashMap<u32, User>>) -> impl Responder {
    if let Some(user) = data.get(&id.into_inner()) {
        HttpResponse::Ok().json(user)
    } else {
        HttpResponse::NotFound().finish()
    }
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let users = web::Data::new(load_users());
    HttpServer::new(move || {
        App::new()
            .app_data(users.clone())
            .route("/user/{id}", web::get().to(get_user))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

get_user 関数は、 特定のIDを持つユーザーをHashMapから検索し、見つかった場合はそのユーザーのデータをJSON形式で返却します。ユーザーが見つからない場合は、404 Not Foundのレスポンスを返します。

main 関数

  • load_users関数を使用してユーザーデータを読み込み、web::Dataでラップしてアプリケーションに渡します。
  • Actix Webサーバーを起動し、”/user/{id}”のルートでget_user関数を呼び出すよう設定します。

こちらで完成です。またPostmanなどで疎通テスト行います。HTTP GETリクエストを“/user/{id}”に送信すると、指定されたIDに対応するユーザー情報がJSON形式で返却されるようれば成功です。

cargo run
curl http://127.0.0.1:8080/user/3
{"id":3,"first_name":"Yuki","last_name":"Sato","username":"yuki_s","email":"yuki.sato@example.com"}

実装ソース

Actix Web Static JSON

非常に簡単に行う事ができました。

この様に、既に公開されているマスターデータであれば、DBの方に持たずファイルとして管理し、動的なデータに関してはDBで扱う、ハイブリットな運用を行うのも良いかも知れませんね。

引き続きActix Webを使い色々と作成していこうと思います。

ではでは。またまたぁ。

Comment

Related Article

Rust-SDL2 examplesをすべて試す

2024.09.01

Rustで創る MOS 6502 CPU その2

2024.07.23

Rustで創る MOS 6502 CPU その1

2024.07.19

Rust – Actix Web mongo ユーザー登録 JWT認証

2024.03.24

Rust – Actix Web JWT 認証認可 APIの作成

2024.02.25

Rust – Actix Web × JSON 静的ファイルをAPIで返却

2024.01.19

Rust – Actix Web × MongoDB環境をサクッと起動

2024.01.18

5分で学ぶ RustでWave Function Collapse (波動関数崩壊アルゴリズム)

2024.01.15

LLaMAモデル GGMLフォーマット(llama.cpp)をRustフレームワーク Leptosを用いて M1MacMiniでサクッと動かす。

2024.01.11

M1Macで行う「RUSTではじめるOpenGL」

2023.02.25

CATEGORY LIST

LATEST NEWS

アーキテクチャConference 2024に参加してきました。

イベント

2024.11.28

Mac minicomでシリアル通信を行う

電子工作

2024.11.21

Mac 容量足りない問題は、外付けSSDで快適に解決!おすすめ外付けSSD

mac

2024.10.16

Z80エミュレータ- EMUZ80の組み立て

電子工作

2024.10.13

Mac VSCodeで、SFML C++開発環境を作る。

C++

2024.09.09

Rust-SDL2 examplesをすべて試す

Rust

2024.09.01

JavaScriptで、DOMを放り投げる処理

JavaScript

2024.07.27

Rustで創る MOS 6502 CPU その2

Rust

2024.07.23

Rustで創る MOS 6502 CPU その1

Rust

2024.07.19

汎用 3D mesh/model viewerを求め。と、簡単に、FBXファイルをglTF(glb)に変換ツールを求め。

C++

2024.06.06

M1 Macで、OpenGL GLUTを使ってコンパイルする

C

2024.04.27

Rust - Actix Web mongo ユーザー登録 JWT認証

Rust

2024.03.24

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US