Actix webでJSONを返す

Actix webでJSONレスポンスを返す。

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

$ cargo new hello-actix-web-json

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

[dependencies]
actix-web = "3"
  1. Raw文字列リテラルを使ってJSONレスポンスを返す
  2. Serdeを使ってJSONレスポンスを返す
Raw文字列リテラルを使ってJSONレスポンスを返す

次に、src/main.rsに以下のコードを書く。JSONとして返却する文字列は、Raw文字列リテラルを利用するとエスケープせずにそのまま書けるので便利だ。返却時のcontent-typeとして、content_type()で"application/json"を指定する。

use actix_web::{get, App, HttpResponse, HttpServer};

#[get("/getjson")]
async fn index() -> HttpResponse {
    HttpResponse::Ok()
        .content_type("application/json")
        .body(r#"{"str":"テスト1","num":100,"arr":[1,2,3]}"#)
}

#[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でアクセスすれば結果が得られる。content-typeも"application/json"となっているのが確認できる。

$ curl -i http://localhost:8080/getjson
HTTP/1.1 200 OK
content-length: 46
content-type: application/json
date: Tue, 12 Jan 2021 23:55:01 GMT

{"str":"テスト1","num":100,"arr":[1,2,3]}
Serdeを使ってJSONレスポンスを返す

SerdeはRustのデータ型をJSONに変換したり、あるいはその逆を行うことができる。Actix WebでSerdeを使えば、RustのデータをJSONレスポンスとして返すことができる。Serdeを使うにはCargo.tomlに依存関係を追加する。

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

RustのオブジェクトをJSONに変換するには、useでSerializeの使用を宣言する。JSONで返却したいオブジェクトに#[derive(Serialize)]を付加する。後は、そのオブジェクトをResponseBuilderのjson()に渡してやればJSONが返却される。

use actix_web::{get, App, HttpResponse, HttpServer};
use serde::Serialize;

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

#[get("/getjson")]
async fn index() -> HttpResponse {
    HttpResponse::Ok().json(MyObj {
        str: "テスト2".to_string(),
        num: 100,
        arr: vec![1, 2, 3],
    })
}

#[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
}

Vecは配列に変換されるようだ。

$ curl -i http://localhost:8080/getjson
HTTP/1.1 200 OK
content-length: 46
content-type: application/json
date: Wed, 13 Jan 2021 00:34:04 GMT

{"str":"テスト2","num":100,"arr":[1,2,3]}
(2021/01/12)

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

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