下面是我尝试过的代码。我正在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)
答案 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,获取按字母顺序排序的第一个可用的 订购。这取决于您包含的工件。”
(底部的链接)。
这意味着,除非您需要自定义引擎配置,否则不必显式初始化,只要将它们以正确的顺序放置(对于JVM),对于iOS,实际上没有任何选择,只有一个内置选项,该选项将自动提取并在内部使用NSUrlSession。