1
/
5

Rust/ActixWebでRestAPIでバリデーションとログ【株式会社ライトコード】

はじめに

最近 Rust のお勉強をしてます。

前回 の続きです。

早く書きたいなビジネスロジック。

その前に

前回から動作環境(主にバージョン)を変更してます。

言語/ライブラリ

バージョン( 括弧内は前回)

Rust

1.78.0(1.75.0)

actix-web

4.5.1(4.4.1)

バリデーション

クエリストリングまたはリクエストボディの内容をチェックする。

そうバリデーション。大事ですね。

ライブラリ(クレート)を追加します。

validator

> cargo add validator --features derive

使い方としてはクエリストリング/リクエストボディを構造体で定義し、対象項目にアトリビュートにチェック内容を定義する、という感じです。

定義できるチェック内容は入力必須、文字数、範囲、正規表現などお馴染みのものからメール、URL 形式チェックなどなど。

サンプル

クエリストリング

最初はクエリストリング(GET)。

  • x は数値(u32): 1〜10 意外はエラー
  • y は文字列(String): 2〜5 文字意外はエラー


// リクエスト(とレスポンス)構造体
#[derive(serde::Deserialize, serde::Serialize, validator::Validate)]
struct ValidateGetStruct {
#[validate(range(min = 1, max = 10, message = "1〜10の値を入力してください."))]
x: u32,
#[validate(length(min = 2, max = 5, message = "2〜5文字で入力してください."))]
y: String,
}

// エンドポイント
#[get("/validate")]
async fn get_validate(
param: Result<actix_web::web::Query, actix_web::Error>,
) -> Result<HttpResponse, ApiCustomError> {
// 1. actix-web
let param = match param {
Ok(param) => param,
Err(err) => return Err(ApiCustomError::ActixWebError(err)),
};
// 2. validate
let is_valid = param.validate();
match is_valid {
Ok(_) => Ok(HttpResponse::Ok().json(ValidateGetStruct {
x: param.x,
y: param.y.to_string(),
})),
Err(err) => Err(ApiCustomError::ValidationError(err)),
}
}

#[validate(range(min = 1, max = 10, message = "1〜10の値を入力してください."))] のように定義します。直感的ですね(ですよね?)。message はエラーメッセージを定義します。

エンドポイントでは  actix_web::web::Query<T> でクエリストリングを受け取り、パラメータの定義有無のチェックしてます。これは actix-web の処理です(validator ではありません)。独自エラーに渡してよしなにレスポンスしたいので Result で囲って match param の判定を実施してます。

(なので必須入力( required)チェックの出番なさそうなんですよね)

パラメータが定義されていたら validator のチェックになります。

param.validate()

でバリデーションを実行します。

これバリデーション定義した構造体のリクエストを利用してる場合、毎度書かなきゃなんですね。

バリデートエラー時のレスポンスをいい感じするためエラーハンドリングを追加修正します。



#[derivae(thiserror::Error, Debug)]
pub enum ApiCustomError {

// バリデートエラー
#[error(transparent)]
ValidationError(#[from] validator::ValidationErrors),

}

impl ResponseError for ApiCustomError {
// ステータスコード
fn status_code(&self) -> actix_web::http::StatusCode {

ApiCustomError::ValidationError(_) => StatusCode::BAD_REQUEST, // ### 追加

}
// エラーレスポンス
fn error_response(&self) -> HttpResponse {

ApiCustomError::ValidationError(err) => {
HttpResponse::build(self.status_code()).json(ErrRes {
message: format!("Bad Request. [{}]", err),
})
}

}

リクエスト不備時、レスポンスはこんな感じ。

# リクエスト

GET /validate?x=0&y=abcdef

# レスポンス
{
"message": "Bad Request. [y: 2〜5文字で入力してください.\nx: 1〜10の値を入力してください.]"
}

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

https://rightcode.co.jp/blogs/47092


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

現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!

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

社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life

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

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

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

現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!

ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。

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

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

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

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

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

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

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

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

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

株式会社ライトコード's job postings

Weekly ranking

Show other rankings
Invitation from 株式会社ライトコード
If this story triggered your interest, have a chat with the team?