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
相关产品推荐
相关产品推荐

