Flutter调用API时如何将List<String>作为值传入JSON请求体
Flutter POST接口调用与Postman结果不一致问题解决方案
你遇到的是Flutter接口调试的高频问题,核心原因是代码侧的请求格式、配置和Postman的实际请求没有完全对齐,按以下步骤排查即可解决:

- 首先对齐请求传参格式与Content-Type
先核对Postman中选中的传参类型,不同类型对应的Flutter写法完全不同,写错格式100%调用失败:- 若选的是
form-data:不要直接传入原生Map作为请求体,需要用FormData构造参数,不要手动硬编码Content-Type请求头,否则会丢失multipart格式必须的boundary分隔符,导致后端解析失败 - 若选的是
x-www-form-urlencoded:需要将请求头Content-Type设为application/x-www-form-urlencoded,参数不要转JSON,直接传入键值对Map即可 - 若选的是
raw下的JSON格式:需要将请求头Content-Type设为application/json,参数必须用jsonEncode()转成JSON字符串后再传入
- 若选的是
- 核对参数细节一致性
重点检查:Postman中参数是否全部勾选、参数名是否存在前后空格、数字/布尔类型参数是否在代码中误传为字符串、是否遗漏Postman中配置的鉴权头/Cookie/固定请求头,Postman会自动做宽松的类型兼容,后端校验严格时类型不匹配会直接返回错误
- 本地调试地址注意事项
如果你是在本地跑后端服务做调试:安卓模拟器访问宿主机本地服务不能用127.0.0.1/localhost,要替换为10.0.2.2;iOS模拟器可以正常使用localhost
可直接复用的代码示例
以下是最常用的Dio库调用示例(优先用Dio,官方http库封装度低容易踩编码坑),先在pubspec.yaml中添加依赖dio: ^5.4.0后执行flutter pub get。
form-data格式调用示例
import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; Future<void> fetchPostData() async { final dio = Dio(); // 在这里配置和Postman一致的请求头,比如鉴权Token,不要手动写Content-Type dio.options.headers = { "Authorization": "你的接口鉴权值,无鉴权可删除本段" }; // 构造和Postman完全一致的键值对参数 final requestData = FormData.fromMap({ "key1": "对应的value1", "key2": "对应的value2", "numParam": 123, // 数字类型直接传数字,不要转字符串 }); try { final res = await dio.post( "你的接口完整请求地址", data: requestData, ); debugPrint("接口响应结果:${res.data}"); } on DioException catch (e) { debugPrint("请求错误信息:${e.message},错误响应:${e.response?.data}"); } }
x-www-form-urlencoded格式调用示例
只需要替换请求体和对应配置即可:
final requestData = { "key1": "对应的value1", "key2": "对应的value2", }; final res = await dio.post( "你的接口完整请求地址", data: requestData, options: Options(contentType: Headers.formUrlEncodedContentType), );
内容的提问来源于stack exchange,提问作者Mimu Saha Tishan
相关产品推荐
相关产品推荐

