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请求的请求体发送给服务器
常见问题排查
- 缺少JSON转换器:Retrofit默认不会自动序列化JSON,必须添加
GsonConverterFactory(或其他JSON转换器),否则请求体无法被服务器解析,导致无响应。 - 参数名称不匹配:确保
@Path的参数名和URL中的占位符完全一致(比如示例中的{id}对应@Path("id")),@Query的参数名要和服务器要求的参数名一致。 - 域名或路径错误:检查Retrofit配置的
baseUrl是否和Postman中使用的域名一致,接口的@POST路径是否正确。 - 请求日志对比:添加
HttpLoggingInterceptor打印完整的请求URL、请求体和响应内容,和Postman的请求做对比,快速定位差异。 - 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
相关产品推荐
相关产品推荐

