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

Retrofit GET请求嵌套JSON查询参数异常,求解决方案

解决Retrofit GET请求传递嵌套查询参数的问题

你遇到的核心问题很明确:GET请求不能用RequestBody来传递查询参数——RequestBody是为POST/PUT这类带请求体的请求设计的,而GET的参数是直接拼接在URL上的,Retrofit不会自动把RequestBody解析成URL查询参数,这就是报错的根源。

针对你的API要求(查询参数格式为{state: 'state', filters: {page: 1, filter: ''}}),这里给你两种可行的解决方案:


方案1:让Retrofit自动展开嵌套对象为URL查询参数

如果你的后端API接受嵌套风格的查询参数(比如state=California&filters[page]=1&filters[filter]=这种格式),可以直接把Filter对象作为@Query参数传递,只要确保你的Retrofit配置了支持嵌套序列化的Converter即可:

首先修改你的接口方法:

@GET("/api/data")
Observable<APIResponse> getData(@Query("state") String state, @Query("filters") Filter filter);

然后确认你的Retrofit实例配置了GsonConverterFactory(这是最常用的Converter):

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build();

Retrofit会自动把Filter对象的字段展开为filters[page]、filters[filter]这样的查询参数,完美匹配API的嵌套结构要求。


方案2:将Filter序列化为JSON字符串传递

如果你的后端要求filters参数是一个完整的JSON字符串(比如state=California&filters={"page":1,"filter":""}),那你需要手动把Filter对象序列化为JSON字符串后再传递:

首先修改接口方法:

@GET("/api/data")
Observable<APIResponse> getData(@Query("state") String state, @Query("filters") String filtersJson);

然后在调用接口时,用Gson把Filter对象转成JSON字符串:

Filter filter = new Filter();
filter.setPage(1);
filter.setFilter("");

Gson gson = new Gson();
String filtersJson = gson.toJson(filter);

yourApiService.getData("your_state_value", filtersJson)
    .subscribe(...);

额外注意事项

  • 检查你的Filter类是否正确添加了@SerializedName注解,确保字段名和API要求完全一致:
    public class Filter {
        @SerializedName("page")
        @Expose
        private int page;
        @SerializedName("filter")
        @Expose
        private String filter;
        // 对应的getter和setter方法
    }
    
  • 如果你用方案1时发现后端不支持filters[page]这种嵌套参数格式,那方案2会是更稳妥的选择。

内容的提问来源于stack exchange,提问作者user1002448

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:45:06