首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Dart 中三种网络请求实现方式

Dart 中三种网络请求实现方式

作者头像
贺公子之数据科学与艺术
发布2025-12-18 08:50:29
发布2025-12-18 08:50:29
1160
举报
HttpClient 网络请求实现

创建 HttpClient 实例并设置超时时间为 5 秒。构造目标 URI 并添加自定义请求头后发起 GET 请求,接收响应后需手动处理数据解码:

代码语言:javascript
复制
Future<void> fetchData() async {
  final client = HttpClient();
  client.idleTimeout = Duration(seconds: 5);
  
  final uri = Uri.parse("https://api.example.com/data");
  final request = await client.getUrl(uri);
  request.headers.add('user-agent', 'Custom-UA');
  
  final response = await request.close();
  if (response.statusCode == HttpStatus.ok) {
    final data = await response.transform(utf8.decoder).join();
    print(data);
  }
}
http 库简化请求流程

通过 http 包可更简洁地完成网络请求,自动处理连接关闭和编码转换:

代码语言:javascript
复制
dependencies:
  http: ^0.13.4
代码语言:javascript
复制
Future<void> fetchData() async {
  final uri = Uri.parse("https://api.example.com/data");
  final response = await http.get(uri, headers: {'user-agent': 'Custom-UA'});
  
  if (response.statusCode == 200) {
    print(response.body);
  }
}
dio 高级功能实现

dio 支持拦截器、文件传输等高级特性,需先添加依赖:

代码语言:javascript
复制
dependencies:
  dio: ^4.0.0

基础请求示例

代码语言:javascript
复制
final dio = Dio();
final response = await dio.get(
  'https://api.example.com/data',
  options: Options(headers: {'user-agent': 'Custom-UA'})
);

文件上传实现

代码语言:javascript
复制
final formData = FormData.fromMap({
  'file': await MultipartFile.fromFile('path/to/file.txt')
});
await dio.post('https://upload.example.com', data: formData);

并发请求处理

代码语言:javascript
复制
final responses = await Future.wait([
  dio.get('https://api1.example.com'),
  dio.post('https://api2.example.com')
]);

拦截器配置

代码语言:javascript
复制
dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    options.headers['token'] = 'auth_token';
    return handler.next(options);
  }
));
响应数据处理建议

对于 JSON 格式响应,推荐使用 jsonDecode 进行解析:

代码语言:javascript
复制
final Map<String, dynamic> data = jsonDecode(response.body);
print(data['key']);

对于大型文件下载,建议使用分块处理:

代码语言:javascript
复制
await dio.download(
  'https://example.com/largefile.zip',
  'local/path.zip',
  onReceiveProgress: (received, total) {
    print('${(received/total*100).toStringAsFixed(0)}%');
  }
);
最佳实践提示
  • 网络请求应始终包裹在 try-catch 块中处理异常
  • 考虑使用封装类统一管理 API 端点
  • 对于生产环境建议实现请求重试机制
  • 重要操作应添加 loading 状态指示器
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HttpClient 网络请求实现
  • http 库简化请求流程
  • dio 高级功能实现
  • 响应数据处理建议
  • 最佳实践提示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档