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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:44:54