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

Postman调用Flask API成功但Flutter端调用失败的解决方案咨询

问题排查与解决方案

你遇到的报错核心原因是前后端请求参数的类型约定不匹配:

  • 你在Flutter端直接把queryParameters整体JSON编码,请求体结构是{"dirty": {"Roster": [], "Athlete": [...]}},dirty字段对应的值是一个嵌套JSON对象
  • 而Flask端的参数定义要求dirty是字符串类型,期望dirty的值本身是经过JSON序列化的字符串,拿到后需要手动执行json.loads转成对象

修复方案

方案1:调整Flutter端请求逻辑(和你当前Postman逻辑对齐)

Postman里你手动把dirty对应的对象转成了JSON字符串填入,Flutter端做相同处理即可:

Uri uri = Uri.parse('https://$apiUrl/api/v1/$endpoint');
// 先将dirty对应的对象序列化为JSON字符串,再封装到请求体
Map<String, dynamic> requestBody = {
  "dirty": json.encode(queryParameters["dirty"])
};
final response = await http.post(uri,
    headers: {
      HttpHeaders.authorizationHeader: 'bearer $accessToken',
      HttpHeaders.contentTypeHeader: 'application/json',
    },
    body: json.encode(requestBody));

调整后dirty字段的值就是标准双引号包裹的JSON字符串,Flask端直接执行json.loads不会再报错。

方案2:调整Flask端解析逻辑(更符合REST API规范)

你当前Postman的用法其实不符合常规接口设计规范,application/json请求中嵌套对象直接传递即可,不需要额外序列化嵌套层。可以直接修改Flask端的参数定义,直接接收字典类型:

self.parser.add_argument("dirty", type=dict, help="Dirty records from local database", location='json')

修改后Flask会自动把请求体里的dirty字段解析为Python字典,不需要再手动调用json.loads。

补充说明

你观察到的「双引号变单引号」不是传输过程中发生了替换,是Python的默认行为:当前Flutter传的dirty是JSON对象,Flask解析后直接就是Python字典,你如果对字典直接执行字符串转换操作,Python输出的字典默认用单引号包裹键值,这时候对这个字符串执行json.loads自然会报错,本质是参数类型不匹配导致的。

内容的提问来源于stack exchange,提问作者Jonah Kornberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:39:03