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
相关产品推荐
相关产品推荐

