Как использовать модель в строке запроса для модернизации 2?

#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()
}