Flutter网络请求插件ajanuw_http的使用

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

Flutter网络请求插件ajanuw_http的使用

在Flutter开发中,网络请求是一个非常常见的需求。ajanuw_http 是一个强大的网络请求插件,支持拦截器、文件下载、文件上传等功能,并且可以与 rxdart 结合实现错误重试机制。以下是详细的使用说明及完整示例。


安装

pubspec.yaml 文件中添加依赖:

dependencies:
  ajanuw_http:

然后运行以下命令安装依赖:

flutter pub get

基本 GET 请求

ajanuw_http 提供了简洁的 API 来发起 HTTP 请求。以下是一个简单的 GET 请求示例:

import 'package:ajanuw_http/ajanuw_http.dart';

void main() async {
  // 初始化 API 实例并设置基础 URL
  var api = AjanuwHttp()..config.baseURL = 'http://localhost:3000/api/';

  // 发起 GET 请求
  var r = await api.get(
    Uri.parse('/'), // 请求路径
    AjanuwHttpConfig(params: {'name': 'Ajanuw'}), // 参数配置
  );

  // 打印返回结果
  print(r.body); // 输出响应体
}

文件下载

ajanuw_http 支持文件流下载,并提供了进度回调功能。以下是一个文件下载的示例:

import 'dart:io';
import 'package:ajanuw_http/ajanuw_http.dart';

void main() async {
  // 初始化 API 实例
  var api = AjanuwHttp();

  // 下载文件的目标 URL
  var url = 'https://i.loli.net/2020/01/14/w1dcNtf4SECG6yX.jpg';

  // 开始下载
  var r = await api.getStream(
    url,
    AjanuwHttpConfig(
      onDownloadProgress: (bytes, total) {
        // 打印下载进度
        print((bytes / total * 100).toInt().toString() + '%');
      },
    ),
  );

  // 将下载的数据写入本地文件
  var f$ = File('./test.jpg').openWrite();
  r.stream.listen(
    f$.add, // 将数据写入文件
    onDone: () {
      f$.close(); // 关闭文件流
      print('done.'); // 下载完成提示
    },
  );
}

文件上传

ajanuw_http 支持文件上传,并允许同时发送普通表单数据和文件。以下是一个文件上传的示例:

import 'dart:io';
import 'package:ajanuw_http/ajanuw_http.dart';

void main() async {
  // 初始化 API 实例并设置基础 URL
  var api = AjanuwHttp()..config.baseURL = 'http://localhost:3000/api';

  // 准备上传的文件和表单数据
  var r = await api.post(
    '/upload',
    AjanuwHttpConfig(
      body: {'data': '111'}, // 普通表单数据
      files: [
        await MultipartFile.fromPath('file', './a.jpg'), // 从本地文件读取
        MultipartFile.fromBytes(
          'file',
          await File('./a.jpg').readAsBytes(), // 从字节数组读取
          contentType: MediaType('image', 'jpeg'),
          filename: 'a.jpg',
        ),
        MultipartFile.fromBytes(
          'file',
          await api.readBytes('https://i.loli.net/2019/10/01/CVBu2tNMqzOfXHr.png'), // 从远程地址读取
          contentType: MediaType('image', 'png'),
          filename: 'CVBu2tNMqzOfXHr.png',
        ),
      ],
    ),
  );

  // 打印上传结果
  print(r.body);
}

使用拦截器

ajanuw_http 支持拦截器功能,可以在请求或响应阶段进行自定义处理。以下是一个拦截器的示例:

import 'package:ajanuw_http/ajanuw_http.dart';
import 'package:http/http.dart';

// 自定义拦截器类
class HeaderInterceptor extends AjanuwHttpInterceptors {
  @override
  Future<AjanuwHttpConfig> request(AjanuwHttpConfig config) async {
    config.headers ??= {}; // 确保 headers 不为空

    // 如果是 POST 请求且 body 是 Map,则添加自定义头
    if (config.method.toLowerCase() == 'post' && config.body is Map) {
      (config.body as Map)['x-key'] = 'key';
    }

    // 添加通用头信息
    config.headers.addAll({'x-senduser': 'ajanuw'});
    return config;
  }

  @override
  Future<BaseResponse> response(BaseResponse response, _) async {
    return response; // 返回原始响应
  }
}

void main() async {
  // 初始化 API 实例并添加拦截器
  var api = AjanuwHttp()
    ..config.baseURL = 'http://localhost:3000/api/'
    ..interceptors.add(HeaderInterceptor());

  // 发起带有拦截器的请求
  var r = await api.post('/', AjanuwHttpConfig(body: {'name': 'ajanuw'}));
  print(r.body);
}

错误重试

结合 rxdart,可以实现请求失败后的自动重试功能。以下是一个错误重试的示例:

import 'package:ajanuw_http/ajanuw_http.dart';
import 'package:rxdart/rxdart.dart';

void main() async {
  // 初始化 API 实例并设置基础 URL
  var api = AjanuwHttp()..config.baseURL = 'http://localhost:3000/api/';

  // 使用 Rx.retry 进行错误重试
  Rx.retry<Response>(
    () {
      return api.get('/retry').asStream().map((r) {
        if (r.statusCode != 200) throw Stream.error(r); // 如果状态码不是 200,则抛出异常
        return r;
      });
    },
    5, // 最多重试 5 次
  ).listen(
    (r) => print(r.body), // 成功时打印响应体
    onError: (er) => print(er), // 失败时打印错误信息
  );
}

捕获请求错误

如果请求失败,可以通过 try-catch 捕获异常并处理错误响应:

try {
  var r = await api.get('');
  print(r.body);
} catch (e) {
  print((e as Response).body); // 打印错误响应体
}

测试

你可以通过以下命令运行单元测试:

pub run test
flutter pub run test
pub run test .\test\ajanuw_http_test.dart

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

1 回复

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


ajanuw_http 是一个用于 Flutter 的网络请求插件,它基于 dio 封装,提供了更简洁的 API 和更强大的功能。使用 ajanuw_http 可以方便地进行 HTTP 请求,并处理请求的各个阶段。

安装

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

dependencies:
  flutter:
    sdk: flutter
  ajanuw_http: ^1.0.0  # 请根据实际情况使用最新版本

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

基本使用

1. 导入包

import 'package:ajanuw_http/ajanuw_http.dart';

2. 发起 GET 请求

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

3. 发起 POST 请求

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

4. 发起 PUT 请求

void updateData() async {
  try {
    var response = await AjanuwHttp.put(
      'https://jsonplaceholder.typicode.com/posts/1',
      data: {
        'id': 1,
        'title': 'foo',
        'body': 'bar',
        'userId': 1,
      },
    );
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

5. 发起 DELETE 请求

void deleteData() async {
  try {
    var response = await AjanuwHttp.delete('https://jsonplaceholder.typicode.com/posts/1');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

高级功能

1. 设置请求头

void fetchDataWithHeaders() async {
  try {
    var response = await AjanuwHttp.get(
      'https://jsonplaceholder.typicode.com/posts/1',
      options: Options(headers: {
        'Authorization': 'Bearer your_token_here',
      }),
    );
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

2. 设置超时

void fetchDataWithTimeout() async {
  try {
    var response = await AjanuwHttp.get(
      'https://jsonplaceholder.typicode.com/posts/1',
      options: Options(
        sendTimeout: 5000, // 发送超时
        receiveTimeout: 5000, // 接收超时
      ),
    );
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

3. 拦截器

ajanuw_http 支持拦截器,你可以在请求发送前或响应接收后进行一些操作。

void setupInterceptor() {
  AjanuwHttp.interceptors.add(InterceptorsWrapper(
    onRequest: (options, handler) {
      // 在请求发送前做一些操作
      print('Request: ${options.uri}');
      return handler.next(options);
    },
    onResponse: (response, handler) {
      // 在响应接收后做一些操作
      print('Response: ${response.data}');
      return handler.next(response);
    },
    onError: (error, handler) {
      // 在请求出错时做一些操作
      print('Error: $error');
      return handler.next(error);
    },
  ));
}

4. 文件上传

void uploadFile() async {
  try {
    var response = await AjanuwHttp.post(
      'https://example.com/upload',
      data: FormData.fromMap({
        'file': await MultipartFile.fromFile('path/to/file.txt', filename: 'file.txt'),
      }),
    );
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!