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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:54:03