Flutter调用POST API时如何传递嵌套结构的custom_field参数
问题原因
你遇到的类型错误本质是代码中某个预期接收String类型的位置,实际传入了嵌套的HashMap对象,结合你的场景,常见是以下3种原因:
- 类型声明拼写错误:你定义Map的时候写的是
Map<Strng,dynamic>,Strng拼写错误少了字母i,正确写法为String,类型声明错误会导致Dart类型推断异常 - 未做JSON序列化:你没有把整个请求参数Map序列化为JSON字符串就直接传给请求体,或者你使用的HTTP请求库配置错误,没有自动将嵌套Map转为JSON格式
- 接口字段特殊要求:部分旧版本Opencart接口会要求
custom_field字段本身是JSON序列化后的字符串,而非嵌套Map对象
解决方案
场景1:接口Content-Type为application/json(你的参考示例符合该场景)
首先修正Map的类型声明,然后使用dart:convert库的jsonEncode方法将整个请求Map转为JSON字符串后再传,完整示例代码如下:
import 'dart:convert'; import 'package:http/http.dart' as http; void registerUser() async { // 1. 正确定义请求参数Map Map<String, dynamic> requestData = { "firstname": "Demo", "lastname": "User", "email": "nash11@vipmail.hu", "password": "password", "confirm": "password", "telephone": "1-541-754-3010", "customer_group_id": 1, "agree": 1, // 嵌套结构直接按JSON格式写即可 "custom_field": { "account": { "1": "+364545454" } } }; // 2. 序列化为JSON字符串 String requestBody = jsonEncode(requestData); // 3. 发起请求 var response = await http.post( Uri.parse("https://opencart3-simple.api.opencart-api.com/api/rest/register"), headers: { "accept": "application/json", "X-Oc-Session": "你的实际session值", "X-Oc-Merchant-Id": "123", "Content-Type": "application/json" }, body: requestBody ); // 处理响应 if(response.statusCode == 200) { print("注册成功:${response.body}"); } else { print("请求失败:${response.statusCode}"); } }
如果你使用的是Dio库,不需要手动转JSON,只要确保请求头配置正确,直接传requestData即可,Dio会自动完成序列化:
import 'package:dio/dio.dart'; void registerUser() async { Map<String, dynamic> requestData = { // 其他参数和上面写法一致 }; Dio dio = Dio(); var response = await dio.post( "https://opencart3-simple.api.opencart-api.com/api/rest/register", options: Options(headers: { "accept": "application/json", "X-Oc-Session": "你的实际session值", "X-Oc-Merchant-Id": "123", }), data: requestData ); }
场景2:上述方案执行后依旧报错
如果确认参数声明、序列化都没问题还是报错,说明对应Opencart接口要求custom_field字段是字符串格式,你只需要单独序列化custom_field部分即可:
Map<String, dynamic> requestData = { // 其他字段保持不变 "custom_field": jsonEncode({ "account": { "1": "+364545454" } }) };
内容的提问来源于stack exchange,提问作者G H Prakash
相关产品推荐
相关产品推荐

