Flutter错误解析插件api_error_parser的使用

Flutter错误解析插件api_error_parser的使用

API Parser

A library for parsing responses from api and converting error codes into messages for the user.

API响应描述

假定响应将符合以下规范。

每个来自服务器的错误应该以以下格式出现:

  • code: 错误的唯一代码。用于从字典中识别错误。
  • target: 某种错误范围。可选值为:field - 错误与某个字段相关,common - 错误与整个请求相关。
  • `message (可选): 开发者的错误消息(仅用于调试目的)
  • **source (可选)**: 附加数据的容器。任意结构:(字段:资源对象属性名称。如果目标设置为field`,则必需)

示例:

{
"data": [
     {
       "id": 1,
       "userName": "Tom",
       "age": 21
     },
     {
       "id": 2,
       "userName": "Bob",
       "age": 22
     }
   ],
  "errors": [
    {
      "code": "insufficient_funds",
      "target": "common",
      "message": "Hi Nick, it seems that user has empty balance"
    },
    {
      "code": "invalid_punctuation",
      "target": "field",
      "source": "userPassword",
      "message": "Hi Vova, it seems that the password provided is missing a punctuation character"
    },
    {
      "code": "invalid_password_confirmation",
      "target": "field",
      "source": {
        "field": "userPassword",
        "someAdditionalData": "bla bla bla"
      },
      "message": "Hi Lesha, it seems that the password and password confirmation fields do not match"
    }
  ]
 }

分页

在服务器响应中应包含分页对象,格式如下:

  • currentPage: 当前返回的页码
  • totalPage: 总页数
  • totalRecord: 总记录数
  • limit: 每页项数

示例:

{
  "data": [
    {
      "id": 1
    },
    {
      "id": 2
    }
  ],
  "pagination": {
    "currentPage": 3,
    "totalPage": 10,
    "totalRecord": 92,
    "limit": 10
  }
}

版本

0.2.2

如何工作

该库提供了现成的接口来处理服务器响应,传递给参数的对象必须符合这些接口。

要初始化错误解析器,必须传递给构造函数:

  • errorMessages: Map<String, E> - 键是错误代码,值是显示的消息
  • defaultErrorMessage: E - 未知错误的消息
  • adapters: Map<Type, ErrorMessageAdapter>
  • fieldErrorMessages: Map<String, Map<String, E>> - 键是字段名。值是一个类似于 errorMessages 的表。

API解析器描述:

  • parse(ApiParserResponse<T> response) - 返回 ApiParserResponse 状态:成功、空或错误
  • getParserResponse(ApiResponse<T> response) - 解析服务器响应对象并返回处理结果
  • getErrors(List<ErrorMessage> errors) - 返回处理过的错误列表
  • getMessageFromCode(String errorCode) - 返回与此错误代码关联的消息
  • getMessage(ErrorMessage errorMessage) - 返回处理过的错误
  • getFirstMessage(List<ErrorMessage> errors) - 返回错误列表中的第一个处理过的错误
  • getFieldMessageFromCode(String field, String errorCode) - 返回错误列表中的第一个处理过的错误

Dart 示例

// 初始化api解析器
final apiParser = ApiParser(
  adapters: {
    ErrorMessageEntity: SimpleErrorMessageAdapter(),
  },
  errorMessages: {
    ErrorCode.INVALID_LOGIN: Message.INVALID_LOGIN
  },
  fieldErrorMessages: {
    FIELD.EMAIL: {
      ErrorCode.INVALID_PASSWORD_CONFIRMATION: Message.PASSWORD_DO_NOT_MATCH,
    },
    FIELD.EMAIL_LENGTH: {ErrorCode.MIN: Message.EMAIL_LENGTH_MESSAGE}
  },
  defaultErrorMessage: Message.DEFAULT,
);

// 解析服务器响应
final ParserResponse<UserEntity> parserResponse = apiParser.getParserResponse(serverResponse);

// 使用解析器解析响应
final ApiParserResponse<UserEntity> apiParserResponse = apiParser.parse(serverResponse);

// 根据解析结果做相应的处理
switch (apiParserResponse.runtimeType) {
    case  ApiParserEmptyResponse: {
      // 处理空响应的情况
      break;
    }
    case  ApiParserErrorResponse: {
      // 处理错误响应的情况
      break;
    }
    case  ApiParserSuccessResponse: {
      // 处理成功响应的情况
      break;
    }
}

更多关于Flutter错误解析插件api_error_parser的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter错误解析插件api_error_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,处理API错误是常见的需求。为了更好地管理和解析API返回的错误,可以使用一些插件来简化这个过程。api_error_parser 是一个假设的插件,用于解析API错误。下面是如何使用这个插件的基本步骤和示例。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 api_error_parser 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  api_error_parser: ^1.0.0  # 假设版本号为1.0.0

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

2. 导入插件

在需要使用 api_error_parser 的文件中导入插件。

import 'package:api_error_parser/api_error_parser.dart';

3. 使用插件解析API错误

假设你有一个API请求返回的JSON数据,其中包含了错误信息。你可以使用 api_error_parser 来解析这些错误。

void main() {
  // 假设这是API返回的JSON数据
  final apiResponse = {
    "status": "error",
    "message": "Invalid input",
    "errors": [
      {"field": "email", "message": "Invalid email format"},
      {"field": "password", "message": "Password must be at least 8 characters"}
    ]
  };

  // 使用api_error_parser解析错误
  final errorParser = ApiErrorParser();
  final parsedErrors = errorParser.parse(apiResponse);

  // 输出解析后的错误信息
  if (parsedErrors.hasError) {
    print("Error Message: ${parsedErrors.message}");
    for (var error in parsedErrors.errors) {
      print("Field: ${error.field}, Message: ${error.message}");
    }
  } else {
    print("No errors found");
  }
}

4. 处理解析后的错误

api_error_parser 通常会返回一个包含错误信息的对象,你可以根据这些信息来显示给用户或进行其他处理。

if (parsedErrors.hasError) {
  // 显示错误信息给用户
  showDialog(
    context: context,
    builder: (context) {
      return AlertDialog(
        title: Text("Error"),
        content: Text(parsedErrors.message),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(context),
            child: Text("OK"),
          ),
        ],
      );
    },
  );
}

5. 自定义错误解析

如果API返回的错误格式与 api_error_parser 默认的格式不同,你可以自定义解析逻辑。

class CustomErrorParser extends ApiErrorParser {
  [@override](/user/override)
  ParsedErrors parse(Map<String, dynamic> json) {
    // 自定义解析逻辑
    final errors = ParsedErrors();
    if (json['status'] == 'error') {
      errors.message = json['error_message'];
      for (var error in json['error_details']) {
        errors.addError(ErrorDetail(
          field: error['field_name'],
          message: error['error_message'],
        ));
      }
    }
    return errors;
  }
}

void main() {
  final apiResponse = {
    "status": "error",
    "error_message": "Invalid input",
    "error_details": [
      {"field_name": "email", "error_message": "Invalid email format"},
      {"field_name": "password", "error_message": "Password must be at least 8 characters"}
    ]
  };

  final errorParser = CustomErrorParser();
  final parsedErrors = errorParser.parse(apiResponse);

  if (parsedErrors.hasError) {
    print("Error Message: ${parsedErrors.message}");
    for (var error in parsedErrors.errors) {
      print("Field: ${error.field}, Message: ${error.message}");
    }
  } else {
    print("No errors found");
  }
}
回到顶部