Flutter Dart调用自定义Body的API时持续出现400解码错误求助
解决Flutter Dart调用API时的400解码错误
问题根源
你代码里的请求体处理逻辑有误:json.encode(customBody.toString())这一行先把Map转成了Dart原生的字符串格式(比如{action: 6, limit: null, offset: 0}),再对这个字符串做JSON编码,最终发送的请求体是一个包裹了非标准格式字符串的JSON,完全不符合API期望的JSON对象结构,这才导致后端无法解码,返回400错误。
另外需要注意:你设置的limit字段值是字符串"null",如果Postman中实际发送的是JSON的null值(而非字符串),这个差异也可能引发问题。
修复方案
直接将customBody这个Map传给json.encode(),不需要先转成字符串——json.encode()本身就能把Dart Map转换成标准的JSON格式字符串。
修正后的完整代码
import 'dart:convert'; import 'package:http/http.dart' as http; import 'dart:developer' as developer; Future<dynamic> ApiDiolos() async { final mapHeader = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'X-Diolos-Key': 'My-Custom-API-Key' }; Uri uri = Uri.parse("https://api.diolos.com/myapipage.php"); var customBody = { "action": "6", "limit": null, // 若Postman中是传JSON null则用这个,否则改成"null" "offset": "0" }; final response = await http.post( uri, headers: mapHeader, body: json.encode(customBody), // 直接编码Map,移除多余的toString() encoding: Encoding.getByName('utf-8') ); // 添加日志方便调试响应内容 developer.log('响应状态码: ${response.statusCode}'); developer.log('响应内容: ${response.body}'); } void main() { ApiDiolos(); }
额外提示
- 核对
limit字段的值与Postman保持一致:如果Postman请求体里limit是null(JSON原生空值),就用null;如果是字符串"null",则保留字符串形式。 - 新增的日志可以帮你直观看到响应状态和内容,便于后续排查其他潜在问题。
内容的提问来源于stack exchange,提问作者Olivier
相关产品推荐
相关产品推荐

