リクエストのバリデーション
必須の依存関係: io.ktor:ktor-server-request-validation
コード例: request-validation
RequestValidationプラグインは、受信リクエストのボディをバリデートする機能を提供します。シリアライザーが設定されたContentNegotiation
プラグインがインストールされている場合、生のRequestBodyまたは指定されたリクエストオブジェクトのプロパティをバリデートできます。RequestBodyのバリデーションに失敗した場合、このプラグインはRequestValidationException
をスローします。この例外は、StatusPagesプラグインを使用して処理できます。
依存関係の追加
RequestValidation
を使用するには、ビルドスクリプトにktor-server-request-validation
アーティファクトを含める必要があります:
RequestValidationのインストール
アプリケーションにインストールするには、指定された
install
関数にRequestValidation
プラグインを渡します。 以下のコードスニペットは、RequestValidation
をインストールする方法を示しています... - ...
embeddedServer
関数呼び出しの内部。 - ...
Application
クラスの拡張関数である、明示的に定義されたmodule
の内部。
RequestValidation
プラグインは、特定のルートにもインストールできます。 これは、異なるアプリケーションリソースに対して異なるRequestValidation
設定が必要な場合に役立ちます。
RequestValidationの設定
RequestValidation
の設定には、主に3つのステップがあります。
1. ボディの受信
RequestValidation
プラグインは、型パラメータを指定して**receive**関数を呼び出すと、リクエストのボディをバリデートします。例えば、以下のコードスニペットは、ボディをString
値として受け取る方法を示しています:
routing {
post("/text") {
val body = call.receive<String>()
call.respond(body)
}
}
2. バリデーション関数の設定
リクエストボディをバリデートするには、validate
関数を使用します。 この関数は、成功または失敗したバリデーション結果を表すValidationResult
オブジェクトを返します。 失敗した結果の場合、**RequestValidationException**がスローされます。
validate
関数には、リクエストボディを2つの方法でバリデートできる2つのオーバーロードがあります:
最初の
validate
オーバーロードは、指定された型のオブジェクトとしてリクエストボディにアクセスすることを可能にします。 以下の例は、String
値を表すリクエストボディをバリデートする方法を示しています:kotlininstall(RequestValidation) { validate<String> { bodyText -> if (!bodyText.startsWith("Hello")) ValidationResult.Invalid("Body text should start with 'Hello'") else ValidationResult.Valid } }
特定のシリアライザーが設定された
ContentNegotiation
プラグインがインストールされている場合、オブジェクトのプロパティをバリデートできます。例:オブジェクトプロパティのバリデーションから詳細を確認してください。2番目の
validate
オーバーロードはValidatorBuilder
を受け入れ、カスタムバリデーションルールを提供できます。 例:バイト配列のバリデーションから詳細を確認してください。
3. バリデーション例外の処理
リクエストのバリデーションが失敗した場合、RequestValidation
はRequestValidationException
をスローします。 この例外を使用すると、リクエストボディにアクセスし、このリクエストに対するすべてのバリデーション失敗の理由を取得できます。
RequestValidationException
は、StatusPagesプラグインを使用して次のように処理できます:
install(StatusPages) {
exception<RequestValidationException> { call, cause ->
call.respond(HttpStatusCode.BadRequest, cause.reasons.joinToString())
}
}
完全な例はこちらから確認できます: request-validation。
例:オブジェクトプロパティのバリデーション
この例では、RequestValidation
プラグインを使用してオブジェクトプロパティをバリデートする方法を見ていきます。 サーバーが以下のJSONデータを含むPOST
リクエストを受信すると仮定します:
POST http://0.0.0.0:8080/json
Content-Type: application/json
{
"id": -1,
"firstName": "Jet",
"lastName": "Brains"
}
id
プロパティのバリデーションを追加するには、以下の手順に従ってください:
上記のJSONオブジェクトを記述する
Customer
データクラスを作成します:kotlin@Serializable data class Customer(val id: Int, val firstName: String, val lastName: String)
JSONシリアライザーを使用して
ContentNegotiation
プラグインをインストールします:kotlininstall(ContentNegotiation) { json() }
サーバー側で
Customer
オブジェクトを次のように受信します:kotlinpost("/json") { val customer = call.receive<Customer>() call.respond(customer) }
RequestValidation
プラグインの設定で、id
プロパティが指定された範囲内にあることを確認するためのバリデーションを追加します:kotlininstall(RequestValidation) { validate<Customer> { customer -> if (customer.id <= 0) ValidationResult.Invalid("A customer ID should be greater than 0") else ValidationResult.Valid } }
この場合、
id
の値が0
以下の場合、RequestValidation
は**RequestValidationException**をスローします。
例:バイト配列のバリデーション
この例では、バイト配列として受信したリクエストボディをバリデートする方法を見ていきます。 サーバーが以下のテキストデータを含むPOST
リクエストを受信すると仮定します:
POST http://localhost:8080/array
Content-Type: text/plain
-1
バイト配列としてデータを受信し、バリデートするには、以下の手順を実行します:
- サーバー側でデータを次のように受信します:kotlin
post("/array") { val body = call.receive<ByteArray>() call.respond(String(body)) }
- 受信したデータをバリデートするには、
ValidatorBuilder
を受け入れ、カスタムバリデーションルールを提供できる、2番目のvalidate
関数オーバーロードを使用します:kotlininstall(RequestValidation) { validate { filter { body -> body is ByteArray } validation { body -> check(body is ByteArray) val intValue = String(body).toInt() if (intValue <= 0) ValidationResult.Invalid("A value should be greater than 0") else ValidationResult.Valid } } }