Flutter网络请求插件ajanuw_http的使用
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
更多关于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');
}
}