Flutter网络请求格式化插件dio_http_formatter的使用

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

Flutter网络请求格式化插件dio_http_formatter的使用

简介

dio_http_formatter 是一个简单的 Dio 拦截器,用于在控制台中以漂亮的格式打印 HTTP 请求和响应,以便更容易调试和分享。它支持多种内容类型的漂亮打印,如 application/jsonapplication/x-www-form-urlencodedtext/html

Pub Version

快速开始

安装包

  1. 在您的项目中安装 dio_http_formatter
    flutter pub get dio_http_formatter
    
    或者如果不是Flutter项目:
    pub get dio_http_formatter
    

添加拦截器

  1. 将拦截器添加到您的 Dio 实例中:
    final _dio = Dio();
    _dio.interceptors.add(HttpFormatter());
    

Dio 版本映射表

根据您使用的 Dio 版本,选择相应的 dio_http_formatter 版本:

Dio Version Package Version
4.x.x 2.x.x
5.x.x 3.x.x

配置选项

以下是可选参数,用于自定义要打印的内容以及如何打印 HTTP 请求和响应:

Property Type Default Value
includeRequest bool true
includeRequestHeaders bool true
includeRequestQueryParams bool true
includeRequestBody bool true
includeResponse bool true
includeResponseHeaders bool true
includeResponseBody bool true
logger Logger PrettyPrinter()
loggingFilter LoggingFilter null

日志过滤器

HttpFormatter 支持通过 loggingFilter 来过滤是否记录请求/响应。例如,不记录返回状态码为 201 的请求/响应:

final dio = Dio();
dio.interceptors.add(
  HttpFormatter(
    loggingFilter: (request, response, error) {
      if (response?.statusCode == 201) {
        return false;
      }
      return true;
    },
  ),
);

警告httpLoggerFilter 已被弃用,请迁移到新的 loggingFilterhttpLoggerFilter 将在下一个主要版本中移除。

示例代码

POST 请求 [application/json]

await _dio.post(
  'https://postman-echo.com/post',
  data: {'foo': 'foo'},
  options: Options()
    ..headers = {
      'my-custom-header': 'my-custom-header',
      'content-type': 'application/json'
    },
);

POST 请求 [multipart/form-data]

await dio.post(
  "https://postman-echo.com/post",
  data: FormData.fromMap({
    "foo": "foo",
    "bar": MultipartFile.fromBytes([1, 2, 3, 4, 5, 6])
  }),
);

POST 请求 [application/x-www-form-urlencoded]

await dio.post(
  "https://postman-echo.com/post",
  data: {
    "foo": "foo",
    "bar": "bar",
  },
  options: Options(contentType: Headers.formUrlEncodedContentType),
);

成功的 GET 请求 [text/html]

await _dio.get('https://example.org');

带查询参数的 GET 请求 [text/html]

await _dio.get(
  'https://example.com',
  queryParameters: {'limit_start': 0, 'search_term': 'dart'},
);

完整示例代码

import 'package:dio/dio.dart';
import 'package:dio_http_formatter/dio_http_formatter.dart';

void main() async {
  final _dio = Dio();

  // 添加拦截器
  _dio.interceptors.add(
    HttpFormatter(
      includeRequest: true,
      includeRequestHeaders: true,
      includeRequestQueryParams: true,
      includeRequestBody: true,
      includeResponse: true,
      includeResponseHeaders: true,
      includeResponseBody: true,
      loggingFilter: (request, response, error) {
        // 不记录返回状态码为 201 的请求/响应
        if (response?.statusCode == 201) {
          return false;
        }
        return true;
      },
    ),
  );

  // 发送GET请求
  await _dio.get('https://example.com', queryParameters: {'limit_start': 0, 'search_term': 'dart'});

  // 发送POST请求
  await _dio.post(
    'https://postman-echo.com/post',
    data: {'foo': 'foo'},
    options: Options()
      ..headers = {
        'my-custom-header': 'my-custom-header',
        'content-type': 'application/json'
      },
  );
}

以上是 dio_http_formatter 插件的详细使用说明及示例代码,希望对您有所帮助!


更多关于Flutter网络请求格式化插件dio_http_formatter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求格式化插件dio_http_formatter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用dio_http_formatter插件来格式化网络请求和响应的示例。dio_http_formatter是一个非常有用的插件,它可以帮助你更好地调试和阅读网络请求和响应的内容。

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

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0  # 确保使用最新版本
  dio_http_formatter: ^1.0.0  # 确保使用最新版本

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

接下来,你可以在你的Flutter项目中使用这些库。以下是一个完整的示例,展示了如何使用dio进行网络请求,并使用dio_http_formatter来格式化请求和响应:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String responseData = '';

  @override
  void initState() {
    super.initState();
    makeNetworkRequest();
  }

  void makeNetworkRequest() async {
    // 创建 Dio 实例
    final dio = Dio();

    // 添加拦截器以格式化请求和响应
    dio.interceptors.add(
      InterceptorsWrapper(
        onRequest: (options, handler) {
          // 打印格式化后的请求
          print(RequestOptionsFormatter(options).format());
          return handler.next(options);
        },
        onResponse: (response, handler) {
          // 打印格式化后的响应
          print(ResponseFormatter(response).format());

          // 更新 UI
          setState(() {
            responseData = response.data.toString();
          });

          return handler.next(response);
        },
        onError: (err, handler) {
          // 打印错误(如果需要格式化错误,可以添加相应的格式化逻辑)
          print(err.response?.data ?? err.message);
          return handler.next(err);
        },
      ),
    );

    // 发起网络请求
    try {
      await dio.get('https://jsonplaceholder.typicode.com/posts/1');
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Network Response:'),
        Text(responseData),
      ],
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含一个按钮(虽然在这个例子中按钮是隐式的,因为我们在initState中直接发起了请求)。我们使用dio库来发起网络请求,并使用dio_http_formatter库来格式化并打印请求和响应的内容。

注意,这个示例中的RequestOptionsFormatterResponseFormatterdio_http_formatter提供的类,它们负责将请求和响应格式化为更易读的字符串。

确保在实际应用中处理错误和异常,并根据需要调整UI更新逻辑。这个示例主要是为了展示如何使用dio_http_formatter来格式化网络请求和响应。

回到顶部