Retrofit GET请求嵌套JSON查询参数异常,求解决方案
你遇到的核心问题很明确: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

