Retrofit @GET请求传递对象参数 @Body替换@Query报错如何解决
报错原因
@Body used with non-body request 错误的根因是HTTP协议规范中GET请求的定位是从服务端获取资源,参数需放在URL查询串中,不支持携带请求体。Retrofit的@GET属于无请求体的请求类型,因此禁止搭配@Body参数注解使用。
解决方案
根据你的实际业务场景选择对应方案即可:
场景1:必须使用GET请求(后端仅支持GET接口)
放弃使用@Body,将自定义对象的所有属性转为URL查询参数即可,推荐用@QueryMap简化代码,无需逐个声明@Query:@GET("some_url") suspend fun getSomething( @Query("simpleString") someString: String, @QueryMap objectParams: Map<String, String> ): List<BackendObject>调用接口前将
SomeDataObjectForGetRequest实例的字段按后端要求的参数名转为键值对传入objectParams即可,Kotlin数据类可编写通用扩展方法一键完成转换,无需手动拼接。如果对象包含嵌套属性,提前扁平化处理成符合后端要求的键值对格式即可。场景2:后端允许用POST请求提交查询参数
直接将请求类型替换为@POST,即可合法使用@Body注解:// 需确认后端该接口支持POST请求,且能解析对应格式的请求体 @POST("some_url") suspend fun getSomething( @Query("simpleString") someString: String, @Body someObject: SomeDataObjectForGetRequest ): List<BackendObject>
内容的提问来源于stack exchange,提问作者Maksym Tsikal
相关产品推荐
相关产品推荐

