Flutter HTTP状态码处理插件http_status的使用

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

Flutter HTTP状态码处理插件http_status的使用

http_status 是一个用于枚举HTTP状态码的Dart库。它支持所有在RFC1945(HTTP/1.0)、RFC2616(HTTP/1.1)和RFC2518(WebDAV)中定义的状态码。

安装

你可以通过以下命令安装 http_status 插件:

dart pub add http_status
# 或者
flutter pub add http_status

或者在 pubspec.yaml 文件的 dependencies: 部分添加如下行:

dependencies:
  http_status: <latest_version>

使用示例

下面是一个简单的使用示例,展示如何利用 http_status 来处理HTTP状态码。

示例代码

import 'package:http/http.dart' as http;
import 'package:http_status/http_status.dart';

Future<Map<String, dynamic>> fetchData(String url) async {
  final res = await http.get(Uri.parse(url));

  // 方法1:经典方法
  if (res.statusCode == HttpStatusCode.ok) { // res.statusCode == 200
    final httpStatus = HttpStatus.fromCode(res.statusCode);

    return {
      'statusCode': res.statusCode,
      'httpStatus': httpStatus,
      'data': res.body
    };
  }

  // 方法2:使用 isSuccessfulHttpStatusCode 进行验证
  if (res.statusCode.isSuccessfulHttpStatusCode) {
    final httpStatus = HttpStatus.fromCode(res.statusCode);

    return {
      'statusCode': res.statusCode,
      'httpStatus': httpStatus,
      'data': res.body
    };
  }

  // 方法3:从响应状态码动态生成 HttpStatus 对象
  final httpStatusResponse = HttpStatus.fromCode(res.statusCode);

  if (httpStatusResponse.isSuccessfulHttpStatusCode) {
    return {
      'statusCode': res.statusCode,
      'httpStatus': httpStatusResponse,
      'data': res.body
    };
  } else if (httpStatusResponse.isClientErrorHttpStatusCode) {
    // 处理客户端错误
    print('Client error occurred: ${httpStatusResponse.description}');
    return {'error': 'Client error'};
  } else {
    // 处理其他错误
    print('Other error occurred: ${httpStatusResponse.description}');
    return {'error': 'Other error'};
  }
}

功能展示

void main() {
  // 打印状态码
  print('${HttpStatusCode.ok}'); // 200
  print('${HttpStatus.ok}');
  // HttpStatus(
  //   code: 200,
  //   name: 'OK',
  //   description: 'The request was fulfilled.'
  // )
  print('${HttpStatusCode.noContent}'); // 204
  print('${HttpStatus.fromCode(404)}');
  // HttpStatus(
  //   code: 404,
  //   name: 'Not Found',
  //   description: 'The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.'
  // )

  // 检查是否为信息性状态码
  print(HttpStatusCode.processing.isInformationHttpStatusCode); // true
  print(HttpStatusCode.notFound.isInformationHttpStatusCode); // false

  // 检查是否为成功状态码
  print(HttpStatusCode.accepted.isSuccessfulHttpStatusCode); // true
  print(HttpStatusCode.notFound.isSuccessfulHttpStatusCode); // false

  // 检查是否为重定向状态码
  print(HttpStatusCode.permanentRedirect.isRedirectHttpStatusCode); // true
  print(HttpStatusCode.notFound.isRedirectHttpStatusCode); // false

  // 检查是否为客户端错误状态码
  print(HttpStatusCode.notFound.isClientErrorHttpStatusCode); // true
  print(HttpStatusCode.processing.isClientErrorHttpStatusCode); // false

  // 检查是否为服务器错误状态码
  print(HttpStatusCode.internalServerError.isServerErrorHttpStatusCode); // true
  print(HttpStatusCode.notFound.isServerErrorHttpStatusCode); // false
}

总结

http_status 提供了一种简便的方式来处理和检查HTTP状态码。通过使用这个库,你可以更方便地根据不同的状态码来执行相应的操作,从而提高代码的可读性和维护性。

如果你需要更多功能或发现任何问题,请访问 issue tracker


这个Markdown文档详细介绍了如何使用 `http_status` 插件来处理HTTP状态码,并提供了一个完整的示例demo。希望这对你有所帮助!

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用http_status插件来处理HTTP状态码的示例代码。这个插件可以帮助你更方便地处理HTTP响应中的状态码,并根据不同的状态码执行相应的逻辑。

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

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

然后运行flutter pub get来获取依赖。

接下来,你可以在你的Flutter项目中使用http_status插件。以下是一个示例,展示了如何发送一个HTTP请求并处理不同的HTTP状态码:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:http_status/http_status.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('HTTP Status Code Handling Example'),
        ),
        body: Center(
          child: HttpStatusCodeHandlingExample(),
        ),
      ),
    );
  }
}

class HttpStatusCodeHandlingExample extends StatefulWidget {
  @override
  _HttpStatusCodeHandlingExampleState createState() => _HttpStatusCodeHandlingExampleState();
}

class _HttpStatusCodeHandlingExampleState extends State<HttpStatusCodeHandlingExample> {
  String responseMessage = "";

  void fetchData() async {
    try {
      Response response = await Dio().get('https://jsonplaceholder.typicode.com/posts/1');

      // 使用HttpStatus处理状态码
      HttpStatus.check(response.statusCode, when: {
        200: () => setState(() {
          responseMessage = "Success: ${response.data}";
        }),
        400: () => setState(() {
          responseMessage = "Bad Request";
        }),
        404: () => setState(() {
          responseMessage = "Not Found";
        }),
        500: () => setState(() {
          responseMessage = "Internal Server Error";
        }),
        // 可以添加更多的状态码处理
        elseAll: () => setState(() {
          responseMessage = "Unexpected status code: ${response.statusCode}";
        }),
      });
    } catch (error) {
      setState(() {
        responseMessage = "Error: ${error.message}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(responseMessage),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: fetchData,
          child: Text('Fetch Data'),
        ),
      ],
    );
  }
}

在这个示例中,我们使用了dio库来发送HTTP请求,并使用http_status插件来处理响应中的状态码。我们定义了一个fetchData方法,该方法发送一个GET请求到https://jsonplaceholder.typicode.com/posts/1,然后根据响应的状态码更新UI。

HttpStatus.check方法接受一个状态码和一个when参数,when参数是一个包含不同状态码处理逻辑的映射。如果状态码匹配到某个键,则执行对应的函数。如果状态码不匹配任何已定义的键,则执行elseAll对应的函数。

这样,你就可以很方便地在Flutter应用中处理HTTP状态码了。

回到顶部