Flutter http包GET请求传int列表 Laravel后端接收报500错误如何解决
问题原因
- 你当前生成的GET查询参数格式为
prices=1&prices=2&prices=3,不符合Laravel的数组参数接收规范。Laravel要求数组类型的查询参数键名必须后缀[],正确格式应为prices[]=1&prices[]=2&prices[]=3,否则Laravel只会读取最后一个同名参数的值(即示例中的3),不会自动解析为数组。 - 后端返回500错误的核心原因是业务代码中将
prices等参数按数组类型操作(如遍历、调用数组方法),但实际接收到的是字符串类型的单个值,类型不匹配触发运行时异常。
解决方法
推荐优先修改前端参数构造逻辑,适配Laravel的传参规范,无需额外后端兼容代码:
- 调整
getFilterContent方法中数组类型参数的键名,后缀添加[],修改示例如下:
getFilterContent() { Map<String, dynamic> data = {'key': '1'}; if (saleFilter!) { data.putIfAbsent('sale', () => '1'); } if (isNewFilter!) { data.putIfAbsent('is_new', () => '1'); } if (pharmaciesFilter .where((element) => element.isSelected == true) .toList() .length > 0) { // 键名改为 pharmacies[] data.putIfAbsent( 'pharmacies[]', () => List.generate( pharmaciesFilter .where((element) => element.isSelected == true) .toList() .length, (index) { var list = pharmaciesFilter .where((element) => element.isSelected == true) .toList(); return list[index].id.toString(); }, )); } if (selFilterPrice .where((element) => element.selected == true) .toList() .length > 0) { var list = selFilterPrice.where((element) => element.selected == true).toList(); // 键名改为 prices[] data.putIfAbsent( 'prices[]', () => List.generate( selFilterPrice .where((element) => element.selected == true) .toList() .length, (index) { return list[index].id.toString(); }, )); } return data; }
- 修改后Dart的
Uri.http方法会自动生成符合规范的查询参数,格式为prices[]=1&prices[]=2&prices[]=3,后端Laravel可直接通过$request->get('prices')获取到数组类型的参数值。
如果无法修改前端代码,可在后端手动解析查询字符串适配现有格式:
// Laravel 控制器中手动解析参数 parse_str($request->getQueryString(), $queryParams); $prices = $queryParams['prices'] ?? [];
内容的提问来源于stack exchange,提问作者Vepa Sabyrow
相关产品推荐
相关产品推荐

