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

Flutter如何发送form-data格式HTTP POST请求并解决参数解析报错

报错原因

你收到的JSON解析错误,核心原因是参数构造不符合接口要求:

  • 该接口的form-data格式仅接收一个名为paramList的表单字段,字段值要求是标准JSON格式的字符串
  • 你当前的实现把业务参数Map直接嵌套在paramList的value中,http包提交表单时会对Map做默认字符串转换,最终传给后端的paramList值是类似{MethodName: GetPlaySequence, ...}的非JSON格式字符串,后端解析JSON时碰到GetPlaySequence首字符G就触发了报错。
正确实现代码

直接修改参数构造逻辑即可,不需要引入额外依赖,修正后的可运行代码如下:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() async {
  const url = 'https://www.lottecinema.co.kr/LCWS/Ticketing/TicketingData.aspx';

  // 构造业务参数Map
  final paramMap = <String, String>{
    "MethodName": "GetPlaySequence",
    "channelType": "HO",
    "osType": "W",
    "osVersion": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    "playDate": "2022-06-29",
    "cinemaID": "1|0001|1013",
    "representationMovieCode": ""
  };

  // 核心修正:将业务参数序列化为JSON字符串,作为paramList字段的值
  final formData = <String, String>{
    "paramList": jsonEncode(paramMap)
  };

  final response = await http.post(
    Uri.parse(url),
    // 不需要手动指定Content-Type,http包会自动补全form表单对应的请求头
    body: formData,
  );

  // 此处可打印response.body验证返回结果
  debugPrint(response.body);

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Scaffold(
        body: Center(child: Text('请求完成')),
      ),
    );
  }
}
注意事项
  • 不要手动设置Content-Type为application/json或者text/plain,否则会破坏form表单的提交格式
  • 不要给paramList的键名加多余冒号,你注释掉的第一版代码里"paramList:"的写法是错误的
  • 提交前不需要对JSON字符串做额外的url编码,http包处理form表单时会自动完成编码

内容的提问来源于stack exchange,提问作者jhlee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:57:20