[kotlin-client] OkHttp call is now non-blocking (#10303)

* suspend method is now non-blocking

* added required imports

* generated the samples

* suspend method is now non-blocking

* added required imports

* generated the samples

* Cancelling the call when the coroutine is cancelled
Only use coroutines when requested
Not adding potentially unavailable imports

Co-authored-by: Guus Bloemsma <Guus.Bloemsma@Rabobank.nl>
This commit is contained in:
Guus Bloemsma 2021-09-03 05:56:31 +02:00 committed by GitHub
parent 8cc2bc4fa7
commit 490c747c2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 103 additions and 3 deletions

View File

@ -26,9 +26,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
{{^threetenbp}} {{^threetenbp}}
import java.time.LocalDate import java.time.LocalDate
@ -39,6 +43,11 @@ import java.time.OffsetTime
{{/threetenbp}} {{/threetenbp}}
import java.util.Date import java.util.Date
import java.util.Locale import java.util.Locale
{{#useCoroutines}}
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlinx.coroutines.suspendCancellableCoroutine
{{/useCoroutines}}
{{#kotlinx_serialization}} {{#kotlinx_serialization}}
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
@ -271,7 +280,7 @@ import com.squareup.moshi.adapter
} }
{{/hasAuthMethods}} {{/hasAuthMethods}}
protected inline fun <reified I, reified T: Any?> request(requestConfig: RequestConfig<I>): ApiInfrastructureResponse<T?> { protected {{#useCoroutines}}suspend {{/useCoroutines}}inline fun <reified I, reified T: Any?> request(requestConfig: RequestConfig<I>): ApiInfrastructureResponse<T?> {
{{#jvm-okhttp3}} {{#jvm-okhttp3}}
val httpUrl = HttpUrl.parse(baseUrl) ?: throw IllegalStateException("baseUrl is invalid.") val httpUrl = HttpUrl.parse(baseUrl) ?: throw IllegalStateException("baseUrl is invalid.")
{{/jvm-okhttp3}} {{/jvm-okhttp3}}
@ -326,7 +335,24 @@ import com.squareup.moshi.adapter
headers.forEach { header -> addHeader(header.key, header.value) } headers.forEach { header -> addHeader(header.key, header.value) }
}.build() }.build()
{{#useCoroutines}}
val response: Response = suspendCancellableCoroutine { continuation ->
val call = client.newCall(request)
continuation.invokeOnCancellation { call.cancel() }
call.enqueue(object : Callback {
override fun onFailure(c: Call, e: IOException) {
continuation.resumeWithException(e)
}
override fun onResponse(c: Call, response: Response) {
continuation.resume(response)
}
})
}
{{/useCoroutines}}
{{^useCoroutines}}
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
{{/useCoroutines}}
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -196,6 +200,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -196,6 +200,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -12,9 +12,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -203,6 +207,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -22,6 +26,9 @@ import java.time.OffsetDateTime
import java.time.OffsetTime import java.time.OffsetTime
import java.util.Date import java.util.Date
import java.util.Locale import java.util.Locale
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlinx.coroutines.suspendCancellableCoroutine
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
open class ApiClient(val baseUrl: String) { open class ApiClient(val baseUrl: String) {
@ -147,7 +154,7 @@ open class ApiClient(val baseUrl: String) {
} }
} }
protected inline fun <reified I, reified T: Any?> request(requestConfig: RequestConfig<I>): ApiInfrastructureResponse<T?> { protected suspend inline fun <reified I, reified T: Any?> request(requestConfig: RequestConfig<I>): ApiInfrastructureResponse<T?> {
val httpUrl = baseUrl.toHttpUrlOrNull() ?: throw IllegalStateException("baseUrl is invalid.") val httpUrl = baseUrl.toHttpUrlOrNull() ?: throw IllegalStateException("baseUrl is invalid.")
// take authMethod from operation // take authMethod from operation
@ -195,7 +202,19 @@ open class ApiClient(val baseUrl: String) {
headers.forEach { header -> addHeader(header.key, header.value) } headers.forEach { header -> addHeader(header.key, header.value) }
}.build() }.build()
val response = client.newCall(request).execute() val response: Response = suspendCancellableCoroutine { continuation ->
val call = client.newCall(request)
continuation.invokeOnCancellation { call.cancel() }
call.enqueue(object : Callback {
override fun onFailure(c: Call, e: IOException) {
continuation.resumeWithException(e)
}
override fun onResponse(c: Call, response: Response) {
continuation.resume(response)
}
})
}
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -197,6 +201,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -197,6 +201,7 @@ internal open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -197,6 +201,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -9,9 +9,13 @@ import okhttp3.ResponseBody
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -195,6 +199,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -197,6 +201,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.util.Date import java.util.Date
import java.util.Locale import java.util.Locale
@ -197,6 +201,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -178,6 +182,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>

View File

@ -11,9 +11,13 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request import okhttp3.Request
import okhttp3.Headers import okhttp3.Headers
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.BufferedWriter import java.io.BufferedWriter
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.io.IOException
import java.net.URLConnection import java.net.URLConnection
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -197,6 +201,7 @@ open class ApiClient(val baseUrl: String) {
}.build() }.build()
val response = client.newCall(request).execute() val response = client.newCall(request).execute()
val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault()) val accept = response.header(ContentType)?.substringBefore(";")?.lowercase(Locale.getDefault())
// TODO: handle specific mapping types. e.g. Map<int, Class<?>> // TODO: handle specific mapping types. e.g. Map<int, Class<?>>