Застрял с ответом Api Ktor
Я пытаюсь создать приложение KMM, используя Ktor для наших ApiServices. Я создал, где у меня есть весь код, связанный с api.
Код для
BaseApiClass
: -
class BaseAPIClass {
//Create Http Client
private val httpClient by lazy {
HttpClient {
defaultRequest {
host = ApiEndPoints.Base.url
contentType(ContentType.Application.Json)
header(CONNECTION, CLOSE)
}
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.ALL
}
install(HttpTimeout) {
requestTimeoutMillis = NETWORK_REQUEST_TIMEOUT
}
expectSuccess = false
// JSON Deserializer
install(JsonFeature) {
val json = Json {
ignoreUnknownKeys = true
coerceInputValues = true
}
serializer = KotlinxSerializer(json)
}
}
}
// Api Calling Functions I have few more similar to this but issue is random and comes in any of the api
@Throws(Exception::class)
suspend fun sampleApi(requestBody: RequestBody?) : Either<CustomException, BaseResponse<EmptyResponseModel>> {
return try {
val response = httpClient.post<BaseResponse<EmptyResponseModel>> {
url(ApiEndPoints.sample.url)
if (requestBody != null) {
body = requestBody
}
}
Success(response)
}
catch (e: Exception) {
Failure(e as CustomException)
}
}
Вот как я вызываю api из приложения iOS: -
val apiClass = BaseApiClass()
func callApi() {
apiClass.sampleApi(requestBody: .init(string: "value here")) { (result, error) in
result?.fold(failed: { (error) -> Any? in
// Error here
}, succeeded: { (result) -> Any? in
// Success here
})
}
}
Теперь, если я попытаюсь вызвать еще несколько похожих API с тем же
object
т.е.
apiClass
затем после нескольких вызовов он застревает внутри моей функции
callApi
он не отправляет даже запрос api (потому что я не вижу журналов запросов, напечатанных в моей консоли), и из-за этого я не могу выполнять никаких других операций, так как я ничего не получаю от api.
Как только я меняю экран или закрываю приложение и пытаюсь вызвать тот же API, он начинает работать нормально.
Но вместо того, чтобы создавать объект только за один раз, как это
apiClass = BaseApiClass()
если я попытаюсь сделать с
BaseApiClass().sampleApi(request params here) {// completion handler here}
он работает нормально, у меня нет проблем с этим.
Я не уверен, из-за чего это происходит, все работает хорошо в
Android
это сталкивается только с
iOS
.
3 ответа
После всех усилий и отработки множества навыков отладки я понял, что мой обработчик завершения в общем модуле никогда не вызывается, даже если я получаю ответ от api.
Единственное решение, которое я достиг, - это создание другого HTTP-клиента с использованием
expect
а также
actual
механизм. Создавая отдельных клиентов, я еще не столкнулся с этой проблемой.
Если у вас есть другие ответы или решения, я был бы рад взглянуть на них.
Попробуйте установить LogLevel.NONE в блоке установки (Logging) .
На данный момент я решил таким образом, потому что это кажется ошибкой Ktor.
См. Https://youtrack.jetbrains.com/issue/KTOR-2711
Это должно быть исправлено в версии 1.6.0.
Вы используете многопоточный вариант библиотеки Coroutines? В официальных документах указано, что вам следует использовать этот вариант при работе с Ktor. Смотрите здесь