Flutter网络请求插件ac_httpx_client的使用

Flutter网络请求插件ac_httpx_client的使用

特性

该插件实现了以下功能:

  • 使用dart:ioHttpClient实现HTTP/1客户端;
  • 使用http2包实现HTTP/2客户端,并在不切断TCP连接的情况下自动回退到HTTP/1;
  • 实现HTTP头部解析、折叠、敏感数据格式化等;
  • 支持HTTP凭证;
  • 遵循RFC-7231和RFC-5861的HTTP私有缓存(存在一些限制,详见下文)。

该插件尚未实现的功能包括:

  • HTTP/2请求的自动重定向;
  • Digest, MACHawk 认证方案;
  • HTTP/2推送流;
  • 不安全的HTTP/1.1连接升级为HTTP/2;
  • 基于TCP的HTTP/2连接(具有先验知识)。

HTTP缓存的限制:

  • 不支持基于内容协商字段的选择缓存条目(这意味着如果对于给定资源存在多个缓存条目,则缓存将向服务器发出条件请求以确定返回哪一个);
  • 不支持部分响应的缓存;
  • 禁用了POST响应的缓存。

使用方法

简单请求

以下是一个简单的HTTP POST请求示例:

const client = HttpxClient();

final request = client.createRequest(
    method: 'POST',
    uri: Uri.parse('https://www.example.com'),
    headers: HttpxHeaders.fromMap({
        'Content-Type': 'application/json; charset=utf-8',
        'Accept': 'application/json',
    }),
);

await request.write('{"data": "hello world!"}'.codeUnits);

final response = await request.dispose();

final data = await response.fold(<int>[], (previous, element) => previous..addAll(element));

await response.dispose();

print(data);
缓存存储

以下是使用Hive数据库作为缓存存储的示例:

import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:hive/hive.dart';

final supportDir = await path_provider.getApplicationSupportDirectory();

// 始终使用加密存储来保护用户数据!
// (并使用适当的方法保护其密钥)
final encryptionCipher = HiveAesCipher('01234567890123456789012345678901'.codeUnits);

HttpxCacheHiveStore store = HttpxCacheHiveStore(
    boxPath: supportDir.path,
    encryptionCipher: encryptionCipher,
);

try {
    await store.open();
} catch (_) {
    // 如果存储打开失败,则从磁盘删除它
    await Hive.deleteBoxFromDisk(
      HttpxCacheHiveStore.defaultBoxName,
      path: supportDir.path,
    );

    // 重新打开存储
    await store.open();
}

final client = HttpxClient();

client.cacheStores.add(store);

// 执行请求...
缓存策略

在发起请求时,可以通过HttpxClient.createRequest方法的cachePolicy参数来控制缓存的行为。以下是一个示例:

const client = HttpxClient();
final request = client.createRequest(
    method: 'GET',
    uri: Uri.parse('https://www.example.com'),
    cachePolicy: HttpxCachePolicy.standard,
);

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

1 回复

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


ac_httpx_client 是一个基于 Dio 的 Flutter 网络请求插件,它提供了更简洁的 API 和更好的封装,适用于 Flutter 应用中的网络请求操作。使用 ac_httpx_client 可以简化网络请求的代码,并且提供了诸如拦截器、请求取消、文件上传等功能。

以下是如何使用 ac_httpx_client 进行网络请求的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  ac_httpx_client: ^1.0.0  # 请使用最新版本

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

2. 导入包

在需要使用网络请求的地方导入 ac_httpx_client

import 'package:ac_httpx_client/ac_httpx_client.dart';

3. 创建实例

你可以通过 AcHttpXClient 类来创建一个网络请求的实例:

final client = AcHttpXClient();

4. 发送 GET 请求

使用 get 方法发送一个 GET 请求:

void fetchData() async {
  try {
    final response = await client.get('https://jsonplaceholder.typicode.com/posts/1');
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

5. 发送 POST 请求

使用 post 方法发送一个 POST 请求:

void postData() async {
  try {
    final response = await client.post(
      'https://jsonplaceholder.typicode.com/posts',
      data: {
        'title': 'foo',
        'body': 'bar',
        'userId': 1,
      },
    );
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

6. 使用拦截器

ac_httpx_client 支持拦截器,你可以在请求发送前或响应返回后进行一些操作:

client.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    // 在请求发送前做一些操作,比如添加请求头
    options.headers['Authorization'] = 'Bearer token';
    return handler.next(options);
  },
  onResponse: (response, handler) {
    // 在响应返回后做一些操作
    print('Response received: ${response.data}');
    return handler.next(response);
  },
  onError: (DioError e, handler) {
    // 在请求失败时做一些操作
    print('Error: $e');
    return handler.next(e);
  },
));

7. 取消请求

你可以通过 CancelToken 来取消一个正在进行的请求:

void cancelRequest() {
  final cancelToken = CancelToken();
  client.get('https://jsonplaceholder.typicode.com/posts/1', cancelToken: cancelToken);
  
  // 取消请求
  cancelToken.cancel('Request cancelled');
}

8. 文件上传

ac_httpx_client 支持文件上传,你可以使用 FormData 来上传文件:

void uploadFile() async {
  final file = await MultipartFile.fromFile('/path/to/file', filename: 'upload.jpg');
  final formData = FormData.fromMap({
    'file': file,
  });

  try {
    final response = await client.post(
      'https://example.com/upload',
      data: formData,
    );
    print('Upload response: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

9. 配置全局选项

你可以通过 AcHttpXClient 的构造函数来配置全局选项,比如 baseUrl、超时时间等:

final client = AcHttpXClient(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  connectTimeout: 5000, // 连接超时时间
  receiveTimeout: 3000, // 接收超时时间
);
回到顶部