kotlin - 如何为 KTOR HTTPclient Multiplatform Kotlin 项目配置引擎?还需要添加 SSL 证书

标签 kotlin httpclient multiplatform ktor

下面是我尝试过的代码。我正在 commonMain 块中尝试以下代码。

suspend fun callHttpFunction(){

val clientEngine = HttpClient{

        engine {
            pipelining = true
            threadsCount = 4
        }

    }

    clientEngine.post<String>("https","m2.testing.com",8080,
        "/TokenServiceEncrypt/api/base/TokenUpdated",requestBlock
    ) {
        headers.append("Content-Type", "application/json")
        headers.append("Accept", "application/json")
        headers.append("SessionToken", "seesfssfsf")
    }
    clientEngine.close()
}

//HttpClient(Apache) fails and so does HttpClient(OkHttp)

最佳答案

我设法使用返回 HttpClient 的期望/实际类每个平台都使用其专用的engine .

expect class HttpClientProvider() {
    fun getHttpClient(host: String, sslPin: String): HttpClient
}

actual class HttpClientProvider {
    actual fun getHttpClient(host: String, sslPin: String): HttpClient {
        val okHttpClient = OkHttpClient.Builder().apply {
            certificatePinner(
                CertificatePinner.Builder()
                    .add(host, sslPin)
                    .build()
            )
        }.build()

        return HttpClient(OkHttp) {
            engine {
                preconfigured = okHttpClient
            }
        }
    }
}

如您所见,您可以通过 OkHttpClientpreconfigured在那里,您可以使用 OkHttp 的所有功能(我使用 certificatePinner()socketFactory()sslSocketFactory )。

这也适用于 iOS(还没有时间测试)。

private val client = HttpClientProvider().getHttpClient(stage.host, stage.sslPin).config {
    requestTimeout?.let {
        install(HttpTimeout) {
            requestTimeoutMillis = it.toLongMilliseconds()
        }
    }

    logLevel?.let {
        install(Logging) {
            logger = Logger.SIMPLE
            level = it
        }
    }
}

你可以使用正常的config { } - 块也是。

关于kotlin - 如何为 KTOR HTTPclient Multiplatform Kotlin 项目配置引擎?还需要添加 SSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59229189/

相关文章:

java - HttpClient 超时

java - 使用 Apache HttpClient 定义源 IP 地址

c# - 商店通用应用程序上的 WebClient

c++ - C/C++ - 计算函数调用中的参数

安卓录像机: failed to get surface

Android:如何从 Kotlin 调用 ndk 函数?

kotlin - 从 init block 中的方法初始化 Kotlin 中的 val

gradle 构建中缺少 kotlin-compiler-embeddable

windows - 适用于 Windows、Linux、MacOS X 的跨平台脚​​本

python - 在 Linux 上运行的 Python 脚本如何调用在 Wine 下运行的 Python 脚本中的例程?