Как установить basePath в Ktor аналогично Retrofit.Builder(). BaseUrl(baseUrl) Retrofit?

Я пробую Ktor путем преобразования существующего проекта, который в настоящее время использует Retrofit.

Хотя я мог легко преобразовать запрос во что-то вроде:

client.get {
    url("$BASE_URL/something/somepage/another")
}

Кажется очень утомительным всегда добавлять $BASE_URLна все пути каждый раз. При модернизации мы могли бы просто сделать что-то вроде:

Retrofit.Builder()
    .baseUrl(BASE_URL)
    .create(SomeServiceClass::class.java)

Я использую defaultRequest и установка BASE_URL там, но, видимо, вы могли только установить url.host а не весь basePath.

Есть ли способ сделать то же самое в Ktor? или, если его нет, как лучше всего справиться с этим?

2 ответа

Решение

Вы можете!

Для этого вам необходимо установить запрос по умолчанию при создании экземпляра клиента.

val httpClient = HttpClient(Android) {
        defaultRequest {
            host = "my.zoo.com"
            url {
                protocol = URLProtocol.HTTPS
            }
        }
    }

val response = httpClient.get<List<CatsResponse>>(
        path = "animals/cats"
)

Это вызовет https://my.zoo.com/animals/cats

Надеюсь, это поможет:)

Из официальных документов

DefaultRequest позволяет настроить базовую часть URL-адреса, которая объединяется с URL-адресом запроса.

      defaultRequest {
    url("https://ktor.io/docs/")
}

Если вы сделаете следующий запрос, используя клиент с указанной выше конфигурацией,...

      val response: HttpResponse = client.get("welcome.html")

... результирующий URL-адрес будет следующим: https://ktor.io/docs/welcome.html

Другие вопросы по тегам