Flutter数据验证插件request_validator的使用

Flutter数据验证插件request_validator的使用

概述

request_validator 是一个用于在Dart Frog应用程序中简化请求对象验证的中间件。它允许为请求对象中的不同字段定义自定义验证规则,确保数据的完整性和防止无效处理。

安装

在你的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  request_validator: ^0.3.0

使用

创建RequestValidator

通过扩展 RequestValidator 类并提供验证规则列表来创建一个自定义的 RequestValidator。你还可以配置验证失败时的响应。

import 'package:request_validator/request_validator.dart';

// 扩展 [RequestValidator] 并提供验证规则列表
// 配置验证失败时的响应
class PersonValidator extends RequestValidator {
  // 验证规则仅适用于POST请求
  PersonValidator() : super(allowedMethods: [HttpMethod.post]);

  // 重写 onError 方法以配置验证失败时的响应对象
  [@override](/user/override)
  FutureOr<Response> onError(List<ValidationError> errors) {
    return Response.json(
      statusCode: HttpStatus.badRequest,
      body: errors.toMapArray()
    );
  }

  // 重写 validationRules 方法以处理请求体和查询参数的验证
  [@override](/user/override)
  List<ValidationRule> validationRules() => [
        // 验证请求体是否包含 `name`,且其值应为字符串
        ValidationRule.body('name', (value) => value is String),
        // 验证请求查询是否有 `code` 字段,且其值应大于0
        ValidationRule.query('code', (value) => int.parse(value) > 0),
        // 验证请求是否设置了 `Content-Type` 头部为 `application/json`
        ValidationRule.headers(
          HttpHeaders.contentTypeHeader,
          (value) => value == 'application/json',
        ),
      ];
}
ValidationRule的其他属性
  • optional: 指定被验证的字段是否为可选字段。如果为 true,库会首先检查该字段是否存在于请求体中。如果不存在,则跳过对该字段的验证。
  • message: 定义当该字段验证失败时使用的自定义错误消息。如果为 null(默认值),则在验证失败时提供通用的错误消息。
请求体验证示例
static final _emailRegExp = RegExp(
  r'^[a-zA-Z\d.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z\d-]+(?:\.[a-zA-Z\d-]+)*$',
);

ValidationRule.body(
  'email',
  (value) => value is String && _emailRegExp.hasMatch(value),
  optional: false,
  message: '邮箱字段为空或无效!',
),
请求查询参数验证示例
ValidationRule.query(
  'filter',
  (value) => ['name', 'age', 'email'].contains(value),
  optional: true,
  message: '有效的过滤器是 - name, age, 和 email。',
),
请求头部验证示例
ValidationRule.headers(
  HttpHeaders.contentTypeHeader,
  (value) => value == 'application/json',
  optional: false,
  message: '请求必须将 application/json 作为内容类型',
),
将PersonValidator用作中间件

通过 serveAsMiddleware 扩展方法将 PersonValidator 转换为中间件函数,并将其应用到处理器中。

Handler middleware(Handler handler) {
  final validator = PersonValidator();
  // serveAsMiddleware 扩展方法将验证器转换为中间件函数
  return handler.use(validator.serveAsMiddleware());
}

示例

以下是一个完整的示例,展示了如何在Dart Frog应用程序中使用 request_validator 进行请求验证。

import 'package:dio/dio.dart';
import 'package:dio_flutter_transformer/dio_flutter_transformer.dart';
import 'package:flutter/material.dart';
import 'package:request_validator/request_validator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Request Validator Example')),
        body: Center(child: ElevatedButton(
          onPressed: () async {
            try {
              final response = await Dio()
                ..options.baseUrl = 'https://example.com/api'
                ..transformer = DioFlutterTransformer()
                ..interceptors.add(PersonValidator().serveAsMiddleware())
                .post('/person', data: {
                  'name': 'John Doe',
                  'email': 'john.doe@example.com',
                  'code': '123'
                });

              print('Response: ${response.data}');
            } catch (e) {
              print('Error: $e');
            }
          },
          child: Text('Submit'),
        )),
      ),
    );
  }
}

class PersonValidator extends RequestValidator {
  PersonValidator() : super(allowedMethods: [HttpMethod.post]);

  [@override](/user/override)
  FutureOr<Response> onError(List<ValidationError> errors) {
    return Response.json(
      statusCode: HttpStatus.badRequest,
      body: errors.toMapArray()
    );
  }

  [@override](/user/override)
  List<ValidationRule> validationRules() => [
        ValidationRule.body('name', (value) => value is String),
        ValidationRule.body(
          'email',
          (value) => value is String && _emailRegExp.hasMatch(value),
          optional: false,
          message: '邮箱字段为空或无效!',
        ),
        ValidationRule.query('code', (value) => int.parse(value) > 0),
        ValidationRule.headers(
          HttpHeaders.contentTypeHeader,
          (value) => value == 'application/json',
        ),
      ];

  static final _emailRegExp = RegExp(
    r'^[a-zA-Z\d.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z\d-]+(?:\.[a-zA-Z\d-]+)*$',
  );
}

更多关于Flutter数据验证插件request_validator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据验证插件request_validator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用request_validator插件进行数据验证的一个示例。request_validator插件可以帮助你在Flutter应用中轻松地进行数据验证。

首先,你需要在pubspec.yaml文件中添加request_validator依赖:

dependencies:
  flutter:
    sdk: flutter
  request_validator: ^最新版本号  # 请替换为最新的版本号

然后,运行flutter pub get来安装依赖。

接下来,我们来看一个具体的代码示例,展示如何使用request_validator进行数据验证。

import 'package:flutter/material.dart';
import 'package:request_validator/request_validator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();
  String _email = '';
  String _password = '';
  String _errorMessage = '';

  final Validator _validator = Validator()
    ..add('email', [
      RequiredField(errorMessage: 'Email is required'),
      Email(errorMessage: 'Invalid email format')
    ])
    ..add('password', [
      RequiredField(errorMessage: 'Password is required'),
      MinLength(6, errorMessage: 'Password must be at least 6 characters long')
    ]);

  void _submit() {
    if (_formKey.currentState!.validate()) {
      final Map<String, dynamic> values = {
        'email': _email,
        'password': _password,
      };

      final Map<String, List<String>> errors = _validator.validate(values);

      if (errors.isEmpty) {
        // No errors, submit the form
        setState(() {
          _errorMessage = '';
        });
        print('Form submitted successfully');
      } else {
        // Display errors
        setState(() {
          _errorMessage = errors.entries.map((entry) {
            return entry.value.map((e) => e).join(', ');
          }).join('\n');
        }).toString();
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Data Validation Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Email is required'; // This will be handled by request_validator
                  }
                  return null;
                },
                onChanged: (value) {
                  setState(() {
                    _email = value;
                  });
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Password is required'; // This will be handled by request_validator
                  }
                  return null;
                },
                onChanged: (value) {
                  setState(() {
                    _password = value;
                  });
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _submit,
                child: Text('Submit'),
              ),
              SizedBox(height: 20),
              if (_errorMessage.isNotEmpty)
                Text(
                  _errorMessage,
                  style: TextStyle(color: Colors.red),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的表单,包括电子邮件和密码字段。我们使用request_validator插件来验证这些字段。

  1. 定义验证规则:在_validator对象中,我们为电子邮件和密码字段定义了验证规则。例如,电子邮件字段必须是必填项,并且格式必须有效;密码字段必须是必填项,并且长度至少为6个字符。

  2. 提交表单:在_submit方法中,我们首先使用Flutter内置的表单验证(虽然在这个例子中我们实际上没有依赖它,因为我们会在_validator中处理验证)。然后,我们将表单字段的值传递给_validator.validate方法。如果验证通过(即没有错误),则表单提交成功;否则,我们显示错误信息。

请注意,为了简洁起见,我们没有在UI中实时显示每个字段的验证错误,而是选择在提交表单时一次性显示所有错误。你可以根据需求调整这一行为。

希望这个示例能帮助你理解如何在Flutter中使用request_validator插件进行数据验证!

回到顶部