package runtime
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
class ApiClient(
private val baseUrl: String,
private val client: OkHttpClient = OkHttpClient(),
private val authenticator: Authenticator? = null,
private val defaultHeaders: Map<String, String> = emptyMap(),
) {
fun newRequest(
method: String,
path: String,
query: Map<String, String>? = null,
body: String? = null,
): Request {
val urlBuilder: HttpUrl.Builder = (baseUrl.trimEnd('/') + path).toHttpUrl().newBuilder()
query?.forEach { (k, v) -> urlBuilder.addQueryParameter(k, v) }
val requestBody = body?.toRequestBody("application/json".toMediaType())
val builder = Request.Builder()
.url(urlBuilder.build())
.method(method, requestBody)
defaultHeaders.forEach { (k, v) -> builder.header(k, v) }
authenticator?.authenticate(builder)
return builder.build()
}
fun execute(request: Request): Response {
return client.newCall(request).execute()
}
}