1
/
5

Rust/ActixWebでRestAPIのルーティング、エラーハンドリングなどなど【株式会社ライトコード】

弊社エンジニアの記事になります。

はじめに

最近Rustのお勉強してます。
C/C++並に早く、かつ安全性が高いと言われているあれです。
色々な用途で利用されてますが、バックエンドを生業としている身としてはWebフレームワークが気になりまして。

  • ・ActixWeb
  • ・Rocket
  • ・Axum

上記が人気みたいですね。

で、その中からActixWebを使用し、簡単なRestAPI作ってみようかと思いました。採用した理由はだいたい1番目に紹介されてたので。吟味はしてないです、許してください。

いきなりですが感想

ドキュメント ありますが、これを読めばすぐにビジネスロジック書けます、な感じでは無かったです。
フレームワークをベースにバリデータやロギングなどは他のライブラリ(Rsutではクレートと言う)を追加して作り込んでいく感じでした。

他のフレームワーク(Axum)もそんな感じ。

うーん、覚えることたくさん?

ともあれ導入部やってみました。

  • 動作環境
    • ・Mac(Intel)
    • ・vscode / devcontainer でよしなに
    • ・Rust: 1.75.0
    • ・actix-web: 4(4.4.1?)

HelloWorld

プロジェクト作成して、フレームワーク追加して( > cargo add actix-web )、main.rsに ドキュメント(getting-started) の記載内容を記述します。

#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}
 
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .service(hello)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

> cargo run で実行し、 http://127.0.0.1:8080 へのアクセスでHello world!確認。

エントリポイント(mainメソッド)ではルーティングの定義とサーバー起動を実施、
ルーティングで設定されたメソッドの属性/アトリビュートでHTTPメソッドとURLパスを記載するみたいですね。

シンプル。

パスパラメータ

何らかのIDなど一意なリソースの取得等でおなじみのパスパラメータの定義。

#[get("/path1/{param1}")]
async fn get_path1(param: actix_web::web::Path<u32>) -> impl Responder {
    let req_param = param.into_inner();
    HttpResponse::Ok().body(format!("param: {}", req_param))
}

{param1}actix_web::web::Path<u32> のu32型(符号無しな整数型)として定義/紐付け。u32型以外(文字列等)でリクエストすると404エラーとなる。

複数定義もできる。その場合はタプルで受け取る。

#[get("/path2/{param1}/{param2}")]
async fn get_path3(params: actix_web::web::Path<(u32, u32)>) -> impl Responder {
    let req_params = params.into_inner();
    HttpResponse::Ok().body(format!(
        "param1: {}, param2: {}",
        req_params.0, req_params.1
    ))
}

スラッシュを含めたURLパラメータ(というかパス)をそのまま受け取りたい、なんてこともできちゃう。

#[get("/path3/{param:.*}")]
async fn get_path3(param: actix_web::web::Path<String>) -> impl Responder {
    let req_param = param.into_inner();
    HttpResponse::Ok().body(format!("param: {}", req_param))
}

{param:.*} と正規表現(全ての値)指定するだけ。
これで例えば http://localhost:8080/path3/do/re/mi へアクセスすると、paramには do/re/mi が設定される。
素敵!需要は無さそうだけど。

記事の続きは下のリンクをクリック!

https://rightcode.co.jp/blog/information-technology/rust-actixweb-restapi

エンジニア積極採用中です!

採用ページはこちら:https://rightcode.co.jp/recruit

エンジニア、デザイナー、営業など積極採用中です!

社長と一杯飲みながらお話しませんか?(転職者向け)

特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk

もっとワクワクしたいあなたへ

現在、ライトコードでは「WEBエンジニア」「スマホアプリエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「エンジニアリングマネージャー」「営業」などを積極採用中です!

有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。

  • もっと大きなことに挑戦したい!
  • エンジニアとしてもっと成長したい!
  • モダンな技術に触れたい!

現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?

ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。

  • ライトコードの魅力を知っていただきたい!
  • 社風や文化なども知っていただきたい!
  • 技術に対して熱意のある方に入社していただきたい!

一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。

【コーポレートサイト】https://rightcode.co.jp/

【採用募集】https://rightcode.co.jp/recruit(こちらからの応募がスムーズ)

【wantedlyぺージ】https://www.wantedly.com/companies/rightcode

株式会社ライトコードでは一緒に働く仲間を募集しています
今週のランキング
株式会社ライトコードからお誘い
この話題に共感したら、メンバーと話してみませんか?