使用@FieldMap 改造请求体

Retrofit requestbody using @FieldMap

我需要通过 Http 请求发送大量数据 class。 这是我的 class:

data class User(
    val uid: String,
    val mobNum: String,
    val isValidated: Boolean,
    val isActivated: Boolean,
    val gender: String,
   ...
   ...
   ...)

这是我用来更新部分数据的 Api 服务。如果需要。

internal interface ProfileApi {    
    @POST("update/profile")
    @FormUrlEncoded
    fun updatePending(
        @Field("_id") uid: String,
        @Field("mobile_num")  mobNum: String,
        @Field("is_validated") isValidated: Boolean,
        @Field("is_activated") isActivated: Boolean,
        @Field("gender") gender: String,
        .....
        ....
    ): Call<ResponseClass>
}

但是这次我需要发送所有50个或更多字段的请求。如何使用 @FieldMap 或任何其他方法将数据键映射到字段键和相应的值。 谢谢。

参考 ->

@FormUrlEncoded
@POST("service_name") 
   void functionName(
        @FieldMap Map<String, String> learning_objective_uuids, @FieldMap Map<String, String> user_uuids, @Field("note") String note,
        Callback<CallBackClass> callback
    );

@FormUrlEncoded
    @POST("service_name") 
       void functionName(
            @Field("learning_objective_uuids[]") ArrayList<String> learning_objective_uuids, @Field("user_uuids[]") ArrayList<String> user_uuids, @Field("note") String note,
            Callback<CallBackClass> callback
        );

这是解决方法.. 创建一个新的 class: refer this

data class UserMap(
    val _id: String,
    val mobile_num: String,
    val is_validated: Boolean,
    val is_activated: Boolean,
    val gender: String
){
    object ModelMapper {
        fun from(user: User) =
            UserMap(user.uid,user.mobNum, user.isValidated, user.isActivated, user.gender)}

使用此映射器(只需用它创建一个 kt 文件)将 UserMap class 映射到 Maprefer this

val gson = Gson()

//convert a data class to a map
fun <T> T.serializeToMap(): Map<String, Any> {
    return convert()
}

//convert a map to a data class
inline fun <reified T> Map<String, Any>.toDataClass(): T {
    return convert()
}

//convert an object of type I to type O
inline fun <I, reified O> I.convert(): O {
    val json = gson.toJson(this)
    return gson.fromJson(json, object : TypeToken<O>() {}.type)
}

然后在你想传递数据的地方像这样使用:

val userMap = UserMap.ModelMapper.from(User).serializeToMap() 

现在将 userMap 传递给接口:

@JvmSuppressWildcards
internal interface MatchesApi {

    @POST("update/profile")
    @FormUrlEncoded
    fun updatePending(
        @FieldMap userMap: Map<String, Any>
    ):Call<ResponseClass>
}

不要忘记用 @JvmSuppressWildcards 注释,否则会出现 retrofit2 throws parameterError(Parameter type must not include a type variable or wildcard) 错误。 玩得开心。