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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:57:06