[Kotlin][Multiplatform] Support custom Ktor HTTP client configuration (#10968)

* Support using a custom Ktor HTTP client configuration

* Remove ApiClient.kt secondary constructor
This commit is contained in:
Tal Kirshboim
2021-11-30 02:33:42 +01:00
committed by GitHub
parent 8702f24f05
commit 6406e5c031
6 changed files with 28 additions and 8 deletions

View File

@@ -24,6 +24,7 @@ import org.openapitools.client.models.ApiResponse
import org.openapitools.client.models.Pet
import org.openapitools.client.infrastructure.*
import io.ktor.client.HttpClientConfig
import io.ktor.client.request.forms.formData
import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.features.json.serializer.KotlinxSerializer
@@ -36,8 +37,9 @@ import kotlinx.serialization.encoding.*
class PetApi(
baseUrl: String = ApiClient.BASE_URL,
httpClientEngine: HttpClientEngine? = null,
httpClientConfig: ((HttpClientConfig<*>) -> Unit)? = null,
jsonSerializer: Json = ApiClient.JSON_DEFAULT
) : ApiClient(baseUrl, httpClientEngine, jsonSerializer) {
) : ApiClient(baseUrl, httpClientEngine, httpClientConfig, jsonSerializer) {
/**
* Add a new pet to the store

View File

@@ -23,6 +23,7 @@ package org.openapitools.client.apis
import org.openapitools.client.models.Order
import org.openapitools.client.infrastructure.*
import io.ktor.client.HttpClientConfig
import io.ktor.client.request.forms.formData
import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.features.json.serializer.KotlinxSerializer
@@ -35,8 +36,9 @@ import kotlinx.serialization.encoding.*
class StoreApi(
baseUrl: String = ApiClient.BASE_URL,
httpClientEngine: HttpClientEngine? = null,
httpClientConfig: ((HttpClientConfig<*>) -> Unit)? = null,
jsonSerializer: Json = ApiClient.JSON_DEFAULT
) : ApiClient(baseUrl, httpClientEngine, jsonSerializer) {
) : ApiClient(baseUrl, httpClientEngine, httpClientConfig, jsonSerializer) {
/**
* Delete purchase order by ID

View File

@@ -23,6 +23,7 @@ package org.openapitools.client.apis
import org.openapitools.client.models.User
import org.openapitools.client.infrastructure.*
import io.ktor.client.HttpClientConfig
import io.ktor.client.request.forms.formData
import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.features.json.serializer.KotlinxSerializer
@@ -35,8 +36,9 @@ import kotlinx.serialization.encoding.*
class UserApi(
baseUrl: String = ApiClient.BASE_URL,
httpClientEngine: HttpClientEngine? = null,
httpClientConfig: ((HttpClientConfig<*>) -> Unit)? = null,
jsonSerializer: Json = ApiClient.JSON_DEFAULT
) : ApiClient(baseUrl, httpClientEngine, jsonSerializer) {
) : ApiClient(baseUrl, httpClientEngine, httpClientConfig, jsonSerializer) {
/**
* Create user

View File

@@ -16,6 +16,7 @@ import io.ktor.client.utils.EmptyContent
import io.ktor.http.*
import io.ktor.http.content.OutgoingContent
import io.ktor.http.content.PartData
import kotlin.Unit
import kotlinx.serialization.json.Json
import org.openapitools.client.apis.*
@@ -25,6 +26,7 @@ import org.openapitools.client.auth.*
open class ApiClient(
private val baseUrl: String,
httpClientEngine: HttpClientEngine?,
httpClientConfig: ((HttpClientConfig<*>) -> Unit)? = null,
private val json: Json
) {
@@ -32,9 +34,13 @@ open class ApiClient(
KotlinxSerializer(json).ignoreOutgoingContent()
}
private val client: HttpClient by lazy {
private val defaultHttpClientConfig: (HttpClientConfig<*>) -> Unit by lazy {
val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClient.serializer }
val clientConfig: (HttpClientConfig<*>) -> Unit = { it.install(JsonFeature, jsonConfig) }
{ it.install(JsonFeature, jsonConfig) }
}
private val client: HttpClient by lazy {
val clientConfig: (HttpClientConfig<*>) -> Unit = httpClientConfig ?: defaultHttpClientConfig
httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig)
}
private val authentications: kotlin.collections.Map<String, Authentication> by lazy {