Модернизация requestbody с использованием @FieldMap - PullRequest
0 голосов
/ 12 июля 2020

Мне нужно отправить большой класс данных по запросу Http. Вот мой класс:

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 или любого другого метода. спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Вот обходной путь ... Создайте новый класс: обратитесь к этому

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 с Map : ссылайтесь на это

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) Ошибка. Удачи.

0 голосов
/ 12 июля 2020

Ссылка -> Как разместить массив при модернизации android

@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
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...