Actix webでJSONをPOSTする

Actix webでJSONをPOSTする。

まずはパッケージを作成する。

$ cargo new hello-actix-web-json

Cargo.tomlに依存関係を追加する。

[dependencies]
actix-web = "3"
serde = { version = "1.0", features = ["derive"] }

次に、src/main.rsに以下のコードを書く。useでDeserializeの使用を宣言する。JSONでPOSTしたいオブジェクトに#[derive(Deserialize)]を付加する。JSONでPOSTしたデータはそのオブジェクトに変換(Deserialize)され、引数として渡される。

以下では、取得したJSONのデータを文字列として返す。

use actix_web::{post, web, App, HttpServer};
use serde::Deserialize;

#[derive(Deserialize)]
struct Info {
    str: String,
    num: isize,
    arr: Vec::<isize>,
}

#[post("/postjson")]
async fn index(info: web::Json<Info>) -> String {
    format!("str: {} num {} arr: {:?}", info.str, info.num, info.arr)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(index))
        // localhostからのみアクセスするなら127.0.0.1
        //.bind("127.0.0.1:8080")?
        // EC2等に配置して外部からアクセスするなら0.0.0.0
        .bind("0.0.0.0:8080")?
        .run()
        .await
}

これをcargo runコマンドで実行すると、Webサーバが8080ポートで起動する。

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.60s
     Running `target/debug/hello-actix-web-json`

例えば、起動したサーバにcurlでJSONをPOSTする。POSTしたデータがオブジェクトに変換され、結果的に文字列として返されるのが確認できる。

$ curl -X POST -H 'Content-Type: application/json' -d '{ "str": "テスト1", "num": 100, "arr": [1, 2, 3] }' http://localhost:8080/postjson
str: テスト1 num 100 arr: [1, 2, 3]
(2021/01/20)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright© 2004-2021 モバイル開発系(K) All rights reserved.
[Home]