Flutter使用Dio请求Eurostat接口返回乱码问题求助
解决Dio请求Eurostat接口返回乱码的问题
问题原因
Eurostat接口返回的内容通常是gzip压缩格式,Python的requests库默认会自动识别并解压压缩响应,但Dio默认配置下没有开启自动解压,直接读取压缩后的二进制数据就会显示乱码。
解决方案
以下两种方法都可以解决问题,选一种即可:
方法1:配置Dio自动解压(推荐)
通过修改Dio的HttpClient适配器,启用自动解压功能,同时会自动添加Accept-Encoding请求头告知服务器可以返回压缩数据:
import 'dart:io'; import 'package:dio/dio.dart'; void fetchEurostatData() async { final dio = Dio(); // 配置HttpClient支持自动解压gzip dio.httpClientAdapter = DefaultHttpClientAdapter() ..onHttpClientCreate = (HttpClient client) { client.autoUncompress = true; // 核心配置:开启自动解压 return client; }; try { // 替换成你的Eurostat CSV接口URL final response = await dio.get('https://ec.europa.eu/eurostat/wdds/rest/data/v2.1/csv/en/your_dataset_id'); print(response.data); // 现在会输出正常的CSV文本 } catch (e) { print('请求失败: $e'); } }
方法2:手动解码压缩数据
如果自动解压不生效,可以手动获取字节数据,用gzip解码后转成UTF-8字符串:
import 'dart:convert'; import 'package:dio/dio.dart'; void fetchEurostatData() async { final dio = Dio(); try { // 请求时指定返回字节数据 final response = await dio.get( 'https://ec.europa.eu/eurostat/wdds/rest/data/v2.1/csv/en/your_dataset_id', options: Options(responseType: ResponseType.bytes), ); // 解码gzip压缩数据并转成字符串 final decodedBytes = gzip.decode(response.data); final csvContent = utf8.decode(decodedBytes); print(csvContent); } catch (e) { print('请求失败: $e'); } }
额外说明
- 确保你的Dio版本是最新的,避免旧版本的适配问题
- 若仍有问题,可以检查请求头是否包含
Accept: text/csv,明确告知服务器返回CSV格式
内容的提问来源于stack exchange,提问作者Denver0619
相关产品推荐
相关产品推荐

