Flutter如何带参数调用API提交数据?附我的实现尝试
Flutter中携带参数调用API提交数据的正确方式
你当前的代码同时混用了URL查询参数和JSON请求体,这大概率不符合API的接收逻辑,需要先明确API的参数传递要求,以下分两种常见场景给出修正方案:
场景1:API通过JSON请求体接收参数(POST请求最常用方式)
这种情况下只需保留基础API地址,所有参数通过JSON格式的请求体传递:
import 'dart:convert'; import 'package:http/http.dart' as http; Future<void> _submitData() async { // 移除URL后带的查询参数,只保留基础接口地址 final url = Uri.parse('http://xxxx/xxxAPI/api/hotel/InsertHotelDailyRevenue'); // 整理参数,注意和API要求的参数名、数据类型严格匹配 final Map<String, dynamic> data = { 'hotel': 'DoubleTree', 'RPTDate': _dateController.text, 'TotalRooms': 299, 'OccupiedRooms': int.parse(_occRoomController.text), // 输入框内容是字符串,需转成API要求的数字类型 'OccupancyRate': occRate, 'ADR': double.parse(_adrController.text), // 金额类参数通常转成double 'RevPAR': RevPAR, 'TotalRoomRevenue': roomRevenue, 'TotalFnBRevenue': FNBRevenue, 'TotalRevenue': TotalRevenue, }; try { final response = await http.post( url, headers: {'Content-Type': 'application/json'}, body: jsonEncode(data), ); // 根据响应状态码处理结果 if (response.statusCode == 200) { // 提交成功:可添加弹窗提示、清空表单等逻辑 print('数据提交成功'); } else { // 提交失败:打印错误信息排查问题 print('提交失败,状态码:${response.statusCode},响应内容:${response.body}'); } } catch (e) { // 捕获网络异常、解析错误等问题 print('请求出错:$e'); } }
注意点:
- 类型转换:输入框的
text属性是字符串,若API要求数字类型(int/double),必须手动转换,避免参数类型不匹配 - 参数名一致性:确保
data中的key和API文档里的参数名完全一致(比如你代码里的RPTDate和URL中的RptDate要确认哪个是正确的,参数名大小写敏感) - 输入校验:提交前可先校验输入内容(比如日期格式、数字合法性),减少无效请求
场景2:API通过URL查询参数接收参数(较少见的POST场景)
如果API要求所有参数通过URL查询参数传递,可使用Uri的queryParameters属性构建URL,避免手动拼接出错:
import 'package:http/http.dart' as http; Future<void> _submitData() async { // 用queryParameters构建带参数的URL final url = Uri( scheme: 'http', host: 'xxxx', path: '/xxxAPI/api/hotel/InsertHotelDailyRevenue', queryParameters: { 'hotel': 'DoubleTree', 'RptDate': _dateController.text, 'TotalRooms': '299', 'OccupiedRooms': _occRoomController.text, 'OccupancyRate': occRate.toString(), 'ADR': _adrController.text, 'RevPAR': RevPAR.toString(), 'TotalRoomRevenue': roomRevenue.toString(), 'TotalFnBRevenue': FNBRevenue.toString(), 'TotalRevenue': TotalRevenue.toString(), }, ); try { final response = await http.post(url); if (response.statusCode == 200) { print('数据提交成功'); } else { print('提交失败,状态码:${response.statusCode},响应内容:${response.body}'); } } catch (e) { print('请求出错:$e'); } }
核心提醒
优先查看API文档确认:
- 参数是通过请求体还是查询参数传递
- 每个参数的名称、数据类型、必填要求
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

