【发布时间】:2020-08-05 07:38:01
【问题描述】:
我正在尝试在 Kotlin/MPP(多平台)项目中使用 ktor client 并在 JVM 目标功能上使用 basic authentication 似乎没有效果。
这是一个重现的例子:
import io.ktor.client.HttpClient
import io.ktor.client.features.ResponseException
import io.ktor.client.features.auth.Auth
import io.ktor.client.features.auth.providers.basic
import io.ktor.client.features.json.JsonFeature
import io.ktor.client.features.json.serializer.KotlinxSerializer
import io.ktor.client.features.logging.DEFAULT
import io.ktor.client.features.logging.LogLevel
import io.ktor.client.features.logging.Logger
import io.ktor.client.features.logging.Logging
import io.ktor.client.request.get
import io.ktor.client.request.header
import kotlinx.coroutines.runBlocking
import java.util.*
fun main() = runBlocking {
val client = HttpClient {
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.HEADERS
}
install(JsonFeature) {
serializer = KotlinxSerializer()
}
install(Auth) {
basic {
username = "user"
password = "pass"
}
}
}
val url = "https://en.wikipedia.org/wiki/Main_Page"
val failing = try {
client.get<String>(url)
} catch (e: ResponseException) {
"failed"
}
val succeeding = try {
client.get<String>(url) {
header("Authorization", "Basic ${Base64.getEncoder().encodeToString("user:pass".toByteArray())}")
}
} catch (e: ResponseException) {
"failed"
}
}
观察
从记录器输出中,您可以看到客户端没有发送Authorization 标头,但是当我手动提供此类标头时我没有遇到任何问题:
第一个请求(失败示例:)
[main] INFO io.ktor.client.HttpClient - REQUEST: https://en.wikipedia.org/wiki/Main_Page
[main] INFO io.ktor.client.HttpClient - METHOD: HttpMethod(value=GET)
[main] INFO io.ktor.client.HttpClient - COMMON HEADERS
[main] INFO io.ktor.client.HttpClient - -> Accept: application/json
[main] INFO io.ktor.client.HttpClient - -> Accept-Charset: UTF-8
[main] INFO io.ktor.client.HttpClient - CONTENT HEADERS
第二次请求(成功示例:)
[main] INFO io.ktor.client.HttpClient - REQUEST: https://en.wikipedia.org/wiki/Main_Page
[main] INFO io.ktor.client.HttpClient - METHOD: HttpMethod(value=GET)
[main] INFO io.ktor.client.HttpClient - COMMON HEADERS
[main] INFO io.ktor.client.HttpClient - -> Authorization: Basic dXNlcjpwYXNz
[main] INFO io.ktor.client.HttpClient - -> Accept: application/json
[main] INFO io.ktor.client.HttpClient - -> Accept-Charset: UTF-8
[main] INFO io.ktor.client.HttpClient - CONTENT HEADERS
环境
- Kotlin:1.4-M1
Ktor Artifacts 版本 1.3.1:
- ktor-client-core
- ktor 客户端日志记录
- ktor-client-json
- ktor 客户端序列化
- ktor-client-auth-basic
我错过了什么吗?
【问题讨论】:
-
不确定是否是这种情况,但这是一个已修复的错误。尝试使用 ktor 版本 1.3.5-M1
-
我找不到这样的版本。你能推荐工件的来源吗?
-
原谅我的记忆,我混淆了协程版本和ktor版本。您应该使用 ktor 版本 1.3.2-1.4-M1。因为它是用新后端编译的。 1.3.1 使用旧后端
标签: kotlin ktor kotlin-multiplatform ktor-client