Как бы я мог параметризовать эту конечную точку, используя Retrofit, пожалуйста? - PullRequest
0 голосов
/ 31 января 2020

Скажем, я хочу запросить API, у которого есть серверный метод для поиска поля, содержащего определенный текст, например:

http://server:2001/tms/xdata/Customer?$filter=contains(Name, 'Walker') 

В Android Studio с использованием Kotlin Я бы сделал интерфейс что-то вроде этого:

    @GET("/tms/xdata/Customer")
    suspend fun fetchAllProductsContaining(@Query("name") searchTerm: String): CustomersResponse

, которое, если я передам один символ 'e' в качестве searchTerm, даст мне:

http://server:2001/tms/xdata/Customer?name=e

Однако мне нужно, чтобы это выглядело так:

http://server:2001/tms/xdata/Customer?%24filter=contains(lower(name)%2C'e')

Поскольку я хочу, чтобы он не учитывал регистр, также обратите внимание, что текст для поиска должен иметь одинарные кавычки.

Буду очень признателен за любую помощь, которую вы, ребята, могли бы оказать. Сервер написан на Delphi с использованием TMS XData

1 Ответ

0 голосов
/ 03 февраля 2020

Ответ - использовать QueryMap. Вызовите функцию следующим образом:

    suspend fun searchProductsRetrofit(searchTerm: String): List<Product> {
        val options: MutableMap<String, String> = HashMap()
        options["\$filter"] = "contains(lower(Name),'$searchTerm')"
        return retrofit().getProducts(options).value
    }

В своем интерфейсе API настройте ее для использования переданных данных следующим образом:

    @GET("/pmi/civic_amenity/CaProduct")
    suspend fun getProducts(@QueryMap options: Map<String, String>): ProductsResponse

...