Flutter API请求时params数组被自动字符串化如何解决
问题解决方法
原因说明
出现该问题的核心原因是请求框架默认的GET参数序列化规则未对数组类型做特殊处理,直接调用数组的toString()方法拼接参数,导致服务端接收到的是完整数组字符串而非多组键值对组成的数组结构。
解决方式
方式一:修改请求库的数组序列化配置(适配Dio底层)
如果你的ApiManager底层基于Dio封装,可通过配置数组序列化规则解决:
- 全局配置:在Dio初始化时指定
arrayFormat参数为ArrayFormat.brackets
final dio = Dio( BaseOptions( baseUrl: 'https://localhost:3000', queryParameters: {'arrayFormat': ArrayFormat.brackets}, ), );
- 单次请求配置:如果仅需该接口适配,可在对应请求的配置项中指定序列化规则
// makeApiCall方法内部请求处添加配置 Response res = await dio.get( '/api/v1/find_institutions/', queryParameters: params, options: Options(extra: {'arrayFormat': ArrayFormat.brackets}), );
方式二:手动修改参数键名(通用适配所有请求库)
如果请求库封装程度高无法修改内部逻辑,可直接在传参时给数组类型参数的键名加[]后缀:
Future<dynamic> fetchInstitutionsCall() { List<int> requestedItemsList =[18,5]; return ApiManager.instance.makeApiCall( callName: 'fetchInstitutions', apiUrl: 'https://localhost:3000/api/v1/find_institutions/', callType: ApiCallType.GET, params: { 'user': 'sam', 'requested_items[]': requestedItemsList, }, returnResponse: true, ); }
修改后请求的Query String会自动拼接为?user=sam&requested_items[]=18&requested_items[]=5,服务端即可直接解析为数组格式。
内容的提问来源于stack exchange,提问作者Abhilash
相关产品推荐
相关产品推荐

