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

Android Kotlin Retrofit中如何不使用@Query注解将参数放在请求体传递

解决方案

因为你当前的请求本身是带文件上传的@Multipart类型,只需要将原来的@Query注解替换为@Part注解,即可把参数放到请求体的表单字段中,不再拼接在URL后。

修改步骤

1. 修改API接口定义

将所有@Query替换为带参数名的@Part注解即可:

@Multipart
@POST("add_passport.php")
suspend fun addPassport(
    @Part image: MultipartBody.Part?,
    @Part("userid") userid: String,
    @Part("fistname") fistname: String,
    @Part("surname") surname: String,
    @Part("nationality") nationality: String,
    @Part("dof") dof: String,
    @Part("gender") gender: String,
    @Part("age") age: String,
    @Part("sig") sig: String,
    @Part("salt") salt: String
):Response<PassportInsertApiClass>

修改完成后,仓库层、ViewModel层、Fragment/Activity调用层的代码都不需要做任何改动,原有逻辑可以直接复用。


可选优化:用@PartMap简化多参数传递

如果后续参数还会新增,不想接口方法的参数列表过长,可以改用@PartMap传递普通参数:

  1. 先修改API接口:
@Multipart
@POST("add_passport.php")
suspend fun addPassport(
    @Part image: MultipartBody.Part?,
    @PartMap params: Map<String, String>
):Response<PassportInsertApiClass>
  1. 修改仓库层代码,把参数封装成Map传入:
suspend fun addPassport(image: MultipartBody.Part?, userid: String,fistname:String,surname:String,nationality:String,
                       gender:String, dof:String,age:String,sig:String,salt:String):Response<PassportInsertApiClass>{
    val paramMap = mapOf(
        "userid" to userid,
        "fistname" to fistname,
        "surname" to surname,
        "nationality" to nationality,
        "dof" to dof,
        "gender" to gender,
        "age" to age,
        "sig" to sig,
        "salt" to salt
    )
    return RetrofitInstance.api.addPassport(image, paramMap)
}

这种方案下ViewModel和调用层代码同样不需要改动。


注意事项

请确认后端接口已经适配从multipart/form-data请求体中读取参数,而非从URL查询参数中取值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:06:00