#android #kotlin #retrofit2
#Android #kotlin #модернизация 2
Вопрос:
Я использую модель класса, подобную приведенной ниже, для хранения информации о данных поиска,
data class SearchDataModel (
var keyword: String? = "",
var from: String? = "",
var to: String? = "",
var page: Int? = null,
var sortby: String? = null,
var orderby: String? = null,
var itemsperpage: Int? = null
)
Для публикации данных мы можем использовать вызов,
@POST("/data/save")
fun saveData(@Body postData: PostDataModel)
Как добиться того же для строки запроса, что-то вроде приведенного ниже?
@GET("/data/search")
fun searchData(@QueryString searchData: SearchDataModel)
Я пытаюсь предотвратить наличие большого количества параметров в функции и иметь необязательный параметр строки запроса.
Комментарии:
1. Я не думаю, что для этого есть альтернативное решение, отличное от явного указания всех параметров
Ответ №1:
Вы должны использовать кодировку URL и передать Map в запрос.
@FormUrlEncoded
@GET("/data/search")
fun searchData(@FieldMap searchData: Map<String, String>)
Тогда у вас есть метод, SearchDataModel
чтобы добавить свойства к Map<String, String>
и передать его searchData
функции.
data class SearchDataModel (
var keyword: String? = "",
var from: String? = "",
var to: String? = "",
var page: Int? = null,
var sortby: String? = null,
var orderby: String? = null,
var itemsperpage: Int? = null
fun toMap(): Map<String, String> {
return mapOf(
"keyword" to keyword,
"from" to from,
"to" to to,
"page" to page,
"sortby" to sortby,
"orderby" to orderby,
"itemsperpage" to itemsperpage
)
}
)
Используйте это так: searchData(searchData: yourData.toMap())
Удачи 🙂
Комментарии:
1. Привет @ Tomas, я изучаю карту запросов и карту полей . Использование любого из них, похоже, приводит к тому же результату.
Ответ №2:
Вы можете использовать аннотацию @QueryMap для модернизации 2.
Интерфейс сервиса должен быть таким;
interface YourService {
@GET("<yourEndPoint>")
fun fetchYourThings(
@QueryMap things: MutableMap<String, Any>
): Single<YourResponse>
}
класс модели;
data class Thing(
val data: String,
val data1: Int,
val data2: Boolean,
) {
fun toMap(): MutableMap<String, Any> = mutableMapOf(
"data" to data,
"data1" to data1,
"data2" to data2,
)
}
вызовите свою службу из источника данных
class YourRemoteDataSource @Inject constructor(
private val yourService: YourService,
) : YourDataSource.Remote {
override fun fetchThings(
key: Things
): Observable<YourResponse> =
yourService
.fetchThingss(
key.toMap(),
).toObservable()
}