如何在Ktor中设置类似于Retrofit的`Retrofit.Builder().baseUrl(baseUrl)`的basePath?

7

我正在尝试使用 Ktor 将一些当前正在使用 Retrofit 的现有项目进行转换。

虽然我可以轻松地将请求转换为以下内容:

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

每次都需要添加$BASE_URL到所有的路径上似乎非常麻烦。在Retrofit中,我们可以这样简单地处理:

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

我尝试使用defaultRequest并在那里设置BASE_URL,但显然只能设置url.host而不是整个basePath

Ktor中有没有相同的方法?如果没有,处理这个问题的最佳实践是什么?

2个回答

22

你可以!

为了做到这一点,您需要在实例化客户端时设置默认请求。

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

希望能帮到你 :)


我明白了。这只是确认您无法设置基本路径,但可以设置基本URL。我可以问一个关于ktor的问题吗?也许你可以帮助我。你知道如何在Ktor中设置SSL吗? - Archie G. Quiñones
1
在默认请求中,您可以提供与请求构建器“HttpRequestBuilder”中相同的任何内容。查看该类以查看所有选项。defaultRequest { host = "animals.zoo.com" url { protocol = URLProtocol.HTTPS //将协议设置为https。 } } - Camarero

4

来自官方文档

DefaultRequest 允许您配置一个基本的 URL 部分,该部分将与请求 URL 合并。

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

如果您使用上述配置的客户端进行以下请求,...
val response: HttpResponse = client.get("welcome.html")

...生成的URL将如下所示:https://ktor.io/docs/welcome.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接