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

时间:2019-12-07 18:49:03

标签: 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)

2 个答案:

答案 0 :(得分:2)

我设法使用期望/实际类,它们返回一个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
            }
        }
    }
}

如您所见,您可以将OkHttpClient传递给preconfigured,在那里,您可以使用OkHttp的所有功能(我使用certificatePinner()socketFactory()和{{ 1}})。

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

sslSocketFactory

您也可以使用常规的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 } } } 块。

答案 1 :(得分:0)

无法在公共块中添加Apache,OkHttp或CIO引擎-这三个特定于JVM(尽管Windows也提供CIO)。将它们添加到您的JVM / Android源集中。另外,

”(对于JVM),默认引擎使用 ServiceLoader,获取按字母顺序排序的第一个可用的 订购。这取决于您包含的工件。”

(底部的链接)。

List of engines by platform

这意味着,除非您需要自定义引擎配置,否则不必显式初始化,只要将它们以正确的顺序放置(对于JVM),对于iOS,实际上没有任何选择,只有一个内置选项,该选项将自动提取并在内部使用NSUrlSession。

Ktor Engines and where they belong: