このサイトは、只今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 – 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

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

Rust

2024.03.24

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

Rust

2024.02.25

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

Rust

2024.01.19

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

Rust

2024.01.18

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

Rust

2024.01.15

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

Rust

2024.01.11

2024年 狙っているモバイルノートPC

tool

2024.01.07

MacOS XcodeにSDL2を追加

tool

2023.12.26

php 7.4にアップデート

PHP

2023.12.24

5分で覚える Flutter Flameで作る Wave Function Collapse - 波動関数崩壊アルゴリズム

AI・Bot・algorithm

2023.12.20

Flutter - Flameでゲーム作成 (キャラクターの移動)

Flutter

2023.07.23

Flutterで作る ChatGPT Prompt Manager

Flutter

2023.07.12

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

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

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

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

FOLLOW US