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

Android中Retrofit如何同时使用@Body、@Path和@Query发起POST请求

解决Retrofit POST请求同时使用@Body、@Path和@Query的问题

正确的接口定义示例

先对应请求体创建数据模型:

Kotlin 版本

data class RequestBodyData(
    val currentItems: List<Any>
)

Java 版本

public class RequestBodyData {
    private List<Object> currentItems;

    public RequestBodyData(List<Object> currentItems) {
        this.currentItems = currentItems;
    }

    public List<Object> getCurrentItems() {
        return currentItems;
    }

    public void setCurrentItems(List<Object> currentItems) {
        this.currentItems = currentItems;
    }
}

然后编写Retrofit接口:

Kotlin 版本

interface ApiService {
    @POST("api/Mobile/FTR2/{id}")
    suspend fun postData(
        @Path("id") id: String, // 对应URL中的JkVqzeqQ82
        @Query("version") version: String, // 对应URL末尾的version参数
        @Body body: RequestBodyData // POST请求的JSON请求体
    ): Response<YourResponseBodyType> // 替换成你实际的响应体类型
}

Java 版本

public interface ApiService {
    @POST("api/Mobile/FTR2/{id}")
    Call<YourResponseBodyType> postData(
        @Path("id") String id,
        @Query("version") String version,
        @Body RequestBodyData body
    );
}

关键注解说明

  • @Path("id"):用来替换URL路径中的占位符{id},把传入的字符串(比如JkVqzeqQ82)填充到对应位置
  • @Query("version"):自动在URL末尾拼接?version=xxx参数,无需手动拼接URL
  • @Body:将数据模型对象自动序列化为JSON格式,作为POST请求的请求体发送给服务器

常见问题排查

  1. 缺少JSON转换器:Retrofit默认不会自动序列化JSON,必须添加GsonConverterFactory(或其他JSON转换器),否则请求体无法被服务器解析,导致无响应。
  2. 参数名称不匹配:确保@Path的参数名和URL中的占位符完全一致(比如示例中的{id}对应@Path("id")),@Query的参数名要和服务器要求的参数名一致。
  3. 域名或路径错误:检查Retrofit配置的baseUrl是否和Postman中使用的域名一致,接口的@POST路径是否正确。
  4. 请求日志对比:添加HttpLoggingInterceptor打印完整的请求URL、请求体和响应内容,和Postman的请求做对比,快速定位差异。
  5. Content-Type问题:如果服务器要求特定的Content-Type,可在接口方法上添加@Headers("Content-Type: application/json")确保请求头正确。

调用示例(Kotlin协程)

// 初始化Retrofit
val apiService = Retrofit.Builder()
    .baseUrl("你的域名地址,比如https://xxx.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // 打印请求日志
    .build()
    .create(ApiService::class.java)

// 发起请求
CoroutineScope(Dispatchers.IO).launch {
    try {
        val response = apiService.postData(
            id = "JkVqzeqQ82",
            version = "2.4.0",
            body = RequestBodyData(currentItems = emptyList())
        )
        if (response.isSuccessful) {
            // 处理成功响应
        } else {
            // 处理错误响应
        }
    } catch (e: Exception) {
        // 处理网络异常
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:15:30