Застрял с ответом 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. Смотрите здесь

Другие вопросы по тегам