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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:52:34