如何在正文中传递api参数而不是@Query标签android kotlin改造

Posted

技术标签:

【中文标题】如何在正文中传递api参数而不是@Query标签android kotlin改造【英文标题】:how can pass api parameter in body instead @Query tag android kotlin retrofit 【发布时间】:2022-01-12 09:43:56 【问题描述】:

如何在body中传递api参数而不是@Query标签 android kotlin 改造

我想在 body 中传递参数而不是 api @Query

我的api接口

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

存储库类

 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>
    return RetrofitInstance.api.addPassport(image, userid,fistname,surname,nationality,gender,dof,age,sig,salt)

查看模型

fun addPassport(image: MultipartBody.Part?, userid: String,fistname:String,surname:String,nationality:String,
                dof:String,gender:String,age:String,sig:String,salt:String):
        MutableLiveData<Response<PassportInsertApiClass>>
    val addPassport = MutableLiveData<Response<PassportInsertApiClass>>()
    viewModelScope.launch 
        addPassport.postValue(repository.addPassport(image, userid, fistname, surname, nationality, dof, gender, age, sig, salt))
    
    return addPassport

片段/活动

settingViewModel.addPassport(body,userId,fistname,surname,nationality,dof,gender,age,sig1,salt1).observe(this,  response ->
                    if (response.isSuccessful)
                        if (response.body()?.status == 1 )
                            Toast.makeText(context, "passport update", Toast.LENGTH_SHORT).show()
                        
                        else 
                            Toast.makeText(context, "something went wrong", Toast.LENGTH_SHORT).show()
                        
                    
                    binding.progress.isVisible = false
                )

【问题讨论】:

【参考方案1】:

您不能在 Multipart 类型的 api 调用中将整个数据类作为 @body 传递,您可以像这样使用它

    @Multipart
    @POST("v1/society")
    fun createSociety(
     @Header("Authorization") authorization: String?,
     @Part profile_photo: MultipartBody.Part?,
     @Part("name") name: RequestBody
     ): Call<EntrepreneurialSocietyCreatedResponse>

这就是您可以将数据作为 Body 传递的方式,在 Api 中传递名称之前,您必须像这样将其转换为 ReqeustBody

societyName.toRequestBody("text/plain".toMediaTypeOrNull())

【讨论】:

以上是关于如何在正文中传递api参数而不是@Query标签android kotlin改造的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户输入的值传递到 c# 中的请求参数正文中?

在正文中发送 GET 请求参数

Api Gateway 是不是允许没有请求正文的发布请求

RESTful API:在请求正文中而不是在 URI 中传递父资源定位器是不是更实用?

将 Swagger 与 Django Rest Framework 一起使用,我可以在不同字段而不是一个正文中看到 POST 参数吗

颤振:如何在 api 正文中传递文本字段值