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

Archives Details

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

Rust

2024.01.19

この記事は最終更新日から1年以上が経過しています。

どもです。

前回「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

ゲーム開発に必要な基本数学入門

2025.08.15

Godot 4 & Rust 始め方

2025.06.19

Rustでつくる ふっかつのじゅもん

2025.04.29

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その5

2025.04.14

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その4

2025.04.10

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その3

2025.04.08

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その2

2025.04.07

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その1

2025.04.05

keyring-rsで、Macのキーチェーンに登録する。

2025.04.04

RustとWebAssemblyによるゲーム開発 Webpack5対応

2025.03.27

CATEGORY LIST

LATEST NEWS

ラズパイが高騰しているのでストレス解消のためAliExpressで購入した電子パーツ達

電子工作

2026.08.02

【2026】【VMware Fusion】MacでWindowsを無料で扱う。

windows

2026.07.19

Raspberry Pi 5 でマインクラフトサーバーを立てる(Java版 × 統合版クロスプレイ対応)

RaspberryPi

2026.06.24

ラズパイが高い。

RaspberryPi

2026.05.26

【Claude Code】フル稼働。ToDo Appを様々なGUIフレームワーク用いて作らせる。

AI・Bot・algorithm

2026.05.24

Macで歩く「たのしいバイナリの歩き方」うさみみハリケーンの代わりに、Cheat Engine / Bit slicerを使用する

アセンブラ

2026.04.12

Macで歩く「たのしいバイナリの歩き方」

アセンブラ

2026.04.10

【Railway】ひたすら安く個人開発サービスを運用する計画

サーバー

2026.04.06

たびのきろく

イベント

2026.02.23

【Railway】MySQLサービスをコスト抑えて運用する

運用

2026.01.19

あけましておめでとうございますmm DjangoアプリをRailwayに移行する。

運用

2026.01.06

効率の良い AI駆動開発について考える

AI・Bot・algorithm

2025.11.09

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

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

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

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

FOLLOW US