You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:42:16