使用@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 映射到 Map:
refer 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)
错误。
玩得开心。
我需要通过 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 映射到 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)
错误。
玩得开心。