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传递普通参数:
- 先修改API接口:
@Multipart @POST("add_passport.php") suspend fun addPassport( @Part image: MultipartBody.Part?, @PartMap params: Map<String, String> ):Response<PassportInsertApiClass>
- 修改仓库层代码,把参数封装成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
相关产品推荐
相关产品推荐

