Flutter异常处理插件http_exception的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter异常处理插件http_exception的使用

介绍

http_exception 是一个用于 Dart 应用程序的 HTTP 异常处理包,提供了一套结构化和可定制的系统来处理 HTTP 异常。它通过预定义的异常类增强了错误管理和开发者的体验。

安装

要安装 http_exception 包,请执行以下命令:

dart pub add http_exception
# 或者
flutter pub add http_exception

或者在 pubspec.yaml 文件中添加以下内容:

dependencies:
  http_exception: ^<latest_version>

然后运行 dart pub getflutter pub get 来安装该包。

使用示例

下面是一个完整的示例,展示如何使用 http_exception 处理 HTTP 异常:

// 导入必要的库
import 'package:http/http.dart' as http;
import 'package:http_exception/http_exception.dart';
import 'package:http_status/http_status.dart';

void main() async {
  exampleHttpStatusFromCode();
  await exampleHttpPost();
  exampleDirectClassHttpException();
}

// 示例:从状态码创建异常
void exampleHttpStatusFromCode() {
  // 创建一个默认的 HttpException 实例
  final HttpException a = HttpStatus.fromCode(422).exception();
  print(a); // 输出: HttpException [422 - Unprocessable Entity]

  // 带有额外数据的 HttpException 实例
  final HttpException b = HttpStatus.fromCode(422)
      .exception(data: <String, dynamic>{'name': 'dart', 'age': 7});
  print(b);
  // 输出: HttpException [422 Unprocessable Entity], HTTP data = {name: dart, age: 7}

  // 带有详细信息和数据的 HttpException 实例
  final HttpException c = HttpStatus.fromCode(422).exception(
    detail: 'Message Customized Detail Exception',
    data: <String, dynamic>{'name': 'dart', 'age': 7},
  );
  print(c);
  // 输出: HttpException [422 Unprocessable Entity]: Message Customized Detail Exception, HTTP data = {name: dart, age: 7}

  // 带有 URI 的 HttpException 实例
  final HttpException d = HttpStatus.fromCode(422).exception(
    detail: 'Message Customized Detail Exception',
    data: <String, dynamic>{'name': 'dart', 'age': 7},
    uri: Uri.parse('http://dart.dev'),
  );
  print(d);
  // 输出: HttpException [422 Unprocessable Entity]: Message Customized Detail Exception, uri = http://dart.dev, HTTP data = {name: dart, age: 7}
}

// 示例:HTTP POST 请求并处理异常
Future<void> exampleHttpPost() async {
  final Uri url = Uri.https('example.com', 'whatsit/create');
  final Map<String, String> body = <String, String>{
    'name': 'doodle',
    'color': 'blue',
  };

  final http.Response response = await http.post(url, body: body);

  final int statusCode = response.statusCode;

  // 如果状态码在 200-299 范围内,表示请求成功
  if (statusCode.isSuccessfulHttpStatusCode) {
    print(response.body);
  } else {
    // 根据状态码自动生成 HttpException
    final HttpException e = statusCode.exception(
      detail: 'Message Customized Detail Exception',
      data: body,
      uri: url,
    );
    print(e);
    // 输出: HttpException [404 Not Found]: Message Customized Detail Exception, uri = https://example.com/whatsit/create, HTTP data = {name: doodle, color: blue}
  }
}

// 示例:直接使用 HttpException 类
void exampleDirectClassHttpException() {
  final HttpException g = NotImplementedHttpException(
    detail: 'Message Customized Detail Exception',
    data: const <String, dynamic>{'name': 'dart', 'age': 7},
    uri: Uri.parse('http://dart.dev'),
  );
  print(g);
  // 输出: HttpException [501 Not Implemented]: Message Customized Detail Exception, uri = http://dart.dev, HTTP data = {name: dart, age: 7}

  final HttpException h = BadGatewayHttpException(
    detail: 'Message Customized Detail Exception',
    data: const <String, dynamic>{'name': 'dart', 'age': 7},
    uri: Uri.parse('http://flutter.dev'),
  );
  print(h);
  // 输出: HttpException [502 Bad Gateway]: Message Customized Detail Exception, uri = http://dart.dev, HTTP data = {name: dart, age: 7}

  final HttpException i = InvalidSSLCertificateHttpException(
    detail: 'Message Customized Detail Exception',
    uri: Uri.parse('http://localhost:80'),
    data: const <String, dynamic>{'id': 1, 'name': 'Dart'},
  );
  print(i);
  // 输出: HttpException [888 InvalidSSLCertificate]: Message Customized Detail Exception, uri = http://localhost, HTTP data = {id: 1, name: Dart}
}

// 自定义异常类
class InvalidSSLCertificateHttpException extends HttpException {
  InvalidSSLCertificateHttpException({
    super.data,
    super.detail = '',
    super.uri,
  }) : super(
          httpStatus: HttpStatus(
            code: 888,
            name: 'InvalidSSLCertificate',
            description: 'InvalidSSLCertificate description',
          ),
        );
}

更多关于Flutter异常处理插件http_exception的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异常处理插件http_exception的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用http_exception插件来处理HTTP异常的示例代码。http_exception插件提供了一个方便的方式来解析和处理HTTP响应中的错误。

首先,确保你的pubspec.yaml文件中已经添加了http_exception依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保http包也在依赖中
  http_exception: ^2.0.0  # 使用最新版本,版本号可能需要根据实际情况调整

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

接下来,你可以在你的Dart代码中这样使用http_exception插件:

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:http_exception/http_exception.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('HTTP Exception Handling'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1000'));
                final data = response.body;
                // 处理成功响应
                ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Data received: $data')));
              } on HttpException catch (e) {
                // 处理HTTP异常
                if (e is BadRequestException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Bad Request: ${e.message}')));
                } else if (e is UnauthorizedException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Unauthorized: ${e.message}')));
                } else if (e is ForbiddenException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Forbidden: ${e.message}')));
                } else if (e is NotFoundException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Not Found: ${e.message}')));
                } else if (e is MethodNotAllowedException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Method Not Allowed: ${e.message}')));
                } else if (e is RequestTimeoutException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Request Timeout: ${e.message}')));
                } else if (e is TooManyRequestsException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Too Many Requests: ${e.message}')));
                } else if (e is ServerErrorException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Server Error: ${e.message}')));
                } else if (e is ServiceUnavailableException) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Service Unavailable: ${e.message}')));
                } else {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('HTTP Error: ${e.message}')));
                }
              } catch (e) {
                // 处理其他异常
                ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: ${e.toString()}')));
              }
            },
            child: Text('Fetch Data'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个Flutter应用,其中包含一个按钮。当点击按钮时,它会尝试从https://jsonplaceholder.typicode.com/posts/1000获取数据(这个URL故意选择了一个不存在的资源以触发404错误)。

我们使用http.get方法发送HTTP GET请求,并在try-on-catch块中捕获可能抛出的异常。如果抛出了HttpException,我们检查它的具体类型(如BadRequestException, UnauthorizedException等),并根据异常类型显示不同的Snackbar消息。

这样,你就可以使用http_exception插件来优雅地处理HTTP响应中的各种错误情况。

回到顶部