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

Flask返回Flutter的JSON数据被截断(80-90字符)如何解决?

解决Flask返回JSON数据被截断的问题

问题分析

你遇到的两种场景本质是同一类问题:Flask返回的JSON响应在传输或处理过程中被截断,可能出在服务器端配置或客户端数据处理环节,下面分场景给出具体解决方案。


一、先确认截断发生的环节

先通过Postman直接调用Flask的接口,如果Postman能拿到完整JSON,说明问题在Flutter客户端;如果Postman也拿到截断数据,问题出在Flask服务器(含反向代理)。


二、服务器端(Flask)解决方法

1. 强制使用jsonify返回响应

不要手动用json.dumps()返回字符串,Flask的jsonify会自动处理Content-Type、Content-Length等响应头,避免因头信息错误导致的截断:

from flask import Flask, jsonify

@app.route('/upload', methods=['POST'])
def upload_image():
    # 处理图片逻辑...
    result_data = {"key": "你的完整长数据内容..."}
    # 用jsonify返回,而非return json.dumps(result_data)
    return jsonify(result_data)

2. 显式设置响应Content-Length(可选)

如果手动构建响应,需确保Content-Length与实际数据长度匹配:

response = jsonify(result_data)
response.headers['Content-Length'] = str(len(response.data))
return response

3. 调整反向代理配置(若用Nginx)

如果Flask通过Nginx反向代理提供服务,Nginx的缓冲区设置过小会导致截断,修改Nginx配置:

location / {
    proxy_pass http://你的Flask服务地址;
    proxy_buffering on;
    proxy_buffer_size 8k;       # 单块缓冲区大小
    proxy_buffers 16 8k;        # 缓冲区总数量和单块大小
    proxy_busy_buffers_size 16k; # 忙时缓冲区大小
}

三、Flutter客户端(Dio)解决方法

1. 避免冗余的字符串转换

你的代码中先将response.data转成字符串再解码JSON,这会增加出错概率,Dio默认会自动解析JSON为Map,直接使用即可:

static Future<AiData> uploadImage(String imagePath) async {
    var formData = FormData.fromMap({
      'file': await MultipartFile.fromFile(imagePath),
    });

    try {
      final response = await flaskDio.post(
        '/upload',
        data: formData,
        options: Options(
          validateStatus: (status) {
            return status! < 500;
          },
        ),
      );

      if (response.statusCode == 200) {
        // 直接使用Dio已解析好的Map,无需转字符串再解码
        logger.i('Response data length: ${response.data.toString().length}');
        try {
          var responseData = response.data as Map<String, dynamic>;
          logger.i('Decoded response data: $responseData');
          return AiData.fromJson(responseData);
        } catch (e) {
          logger.e('Failed to parse response data: $e');
          throw Exception('Failed to parse response data: $e');
        }
      } else {
        logger.e('Image upload failed.');
        throw Exception('Failed to upload image: ${response.statusMessage}');
      }
    } catch (e) {
      logger.e('Image upload failed: $e');
      if (e is DioError) {
        logger.e('Dio error message: ${e.message}');
        logger.e('Dio error response data length: ${e.response?.data.toString().length}');
      }
      throw Exception('Image upload failed: $e');
    }
  }

2. 调整日志输出限制

如果是日志打印被截断(而非实际数据),修改logger的输出宽度限制:

// 初始化logger时调整maxWidth
final logger = Logger(
  printer: PrettyPrinter(
    maxWidth: 300, // 调大宽度避免截断
    methodCount: 0,
  ),
);

内容的提问来源于stack exchange,提问作者김경영

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:04:56