😽

「actix-web」入門#2 リクエストパラメータ

2022/05/23に公開
2

初めに

今回はリクエストパラメータを見てみる。

前回の「examples」の中だと「templating」の「tinytemplate」が参考になりそう。
※「examples」のURLは以下です。
https://github.com/actix/examples

余談になるけど「examples」の「developperが粋をつくして、意見出し合ってみました!!!」みたいな感じがたまらなく好き。

多分、「cargo run --example 【任意のプロジェクト】」とかのコマンド使っちゃうと本記事の一番下にある『蛇足』みたくissueが発生することがあるから「examples」みたくわざわざフォルダ切ってあるんだと思う。

「tinytemplate」を動かしてみる

http://localhost:8080」でポストするとこんな感じで帰ってくる
サーバ起動の様子

うん、シンプル

「tinytemplate」のソース確認

フォルダ構成はこんな感じ

フォルダ構成

main.rsを見てみる

// store tiny_template in application state
async fn index(
    tmpl: web::Data<TinyTemplate<'_>>,
    query: web::Query<HashMap<String, String>>,
) -> Result<HttpResponse, Error> {
    ...
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    ...
}

// Custom error handlers, to return HTML responses when an error occurs.
fn error_handlers() -> ErrorHandlers<BoxBody> {
    ...
}

// Error handler for a 404 Page not found error.
fn not_found<B>(res: ServiceResponse<B>) -> Result<ErrorHandlerResponse<BoxBody>> {
    ...
}

// Generic error handler.
fn get_error_response<B>(res: &ServiceResponse<B>, error: &str) -> HttpResponse {
    ...
}

static ERROR: &str = include_str!("../templates/error.html");
static INDEX: &str = include_str!("../templates/index.html");
static USER: &str = include_str!("../templates/user.html");

前回見てたのと全然違うや( ゚Д゚)

前回は下記みたくアットリビュートでリクエスト内容を指定してたけど、
今回は指定なしなので、ルートで全リクエスト受け付けるらしい
#[get("/welcome")]

で、リクエストパラメータは「web::get」ってマクロで取得できるみたい
indexって関数に引数を渡す感じになってる

リクエストは以下の「web::get」でGETメソッドを指定してるらしい。
「to(任意の関数)」でGET時に任意の関数を実行するっぽい

リクエストパラメータを渡す箇所

で、リクエストパラメータの取得は「query.get()」でできるっぽい
※関数の引数は任意のあらかた決まってるらしい(次回解説)

TinyTemplatetってなんぞ?

「TinyTemplatetってなんぞ?」とか思ってたら、HTMLテンプレートを扱うクレートらしい
javaは「Spring」フレームワークのThymeleafみたいな感じ

今回の例では「Hi, {name}!」のとこに「Hi,テスト!」が埋まってレスポンスされてた
template

次回

corsについて話します。(リクエストボディも含む)
その次はdb周りとかかな

ライバルとなる「warp」ってフレームワークでは
「warp::test::request()」関数使ってリクエストテストできるらしい。
なので、その辺も追求してみたい。

『蛇足』

やってて、デスクトップアプリ「iced」で「cargo run --example 【任意のプロジェクト】」したときはうまくいくのにソースコピーして「cargo run」やると動かないissueを思い出した。
https://github.com/iced-rs/iced/issues/307
https://github.com/iced-rs/iced/pull/607

rustはまだ未開発な部分もあるから、上記のデスクトップアプリ「iced」の例みたく、issuesからblanch作って、trunkにマージされるみたいな流れがリアルタイムで見れて楽しい(´ω`)

「examples」見ながらまったりやっていこうと思ってたら、以下のサイトがよっぽど分かりやすくまとめてられてたや(^^♪
https://zenn.dev/tminasen/scraps/ca0255c92e0537

まあ、車輪の発明ではないけど実装例紹介しながら、ここではゆっくり進めていきます。

Discussion

Yuki OkushiYuki Okushi

多分、「cargo run --example 【任意のプロジェクト】」とかのコマンド使っちゃうと本記事の一番下にある『蛇足』みたくissueが発生することがあるから「examples」みたくわざわざフォルダ切ってあるんだと思う。

補足させてください。
Icedのissueについては存じ上げないのですが、Actixがexamplesを別repoにしているのは単に外部クレートを多数使っているおかげで依存関係がバカでかくて、もしactix-web repoに置いてしまうとCIの時間が必要以上に長くなるなどのデメリットがあるためです。なのでactix-web repoでは https://github.com/actix/actix-web/tree/master/actix-web/examples のようなbasicなexampleのみ取り扱っています。
参考になれば幸いです!

アウラアウラ

外部クレートの依存関係の読込に時間がかかりすぎるというのは盲点でした。

ここからは体験談なのですが、
webはTomcatの起動も複数のプロジェクトを指定するとその分読み込みに時間がかかってしまうので、
プロジェクトを動的Webに対応させてTomcatサーバを任意のプロジェクト毎に使い分ける(プロジェクトをグループに分ける)みたいなことをやったのを思い出しました。

私のTomcatの例では、webサーバ毎に割り当てるプロジェクトの量を考えるのですが、huyuumiさんの例では、プロジェクト毎に割り当てるCLの量を考えるって感じですね。