1

我正在尝试使用 Ktor 为我们的 ApiServices 构建 KMM 应用程序。我创建了一个BaseApiClass拥有所有 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)
    }
}

这是我从 iOS 应用程序调用 api 的方式:-

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 
            })
        }
    }

现在在这里,如果我尝试用相同的objectie调用更多类似的 api,apiClass那么在几次调用之后它就会卡在我的函数callApi中,它甚至不会发送 api 请求(因为我看不到控制台中打印的请求日志)并且因为我不能做任何其他操作,因为我没有从 api 得到任何东西。

一旦我更改屏幕或关闭应用程序并尝试调用相同的 api,它就会运行良好。

apiClass = BaseApiClass()但是,如果我尝试使用它,而不是像这样只在一次创建一个对象,BaseApiClass().sampleApi(request params here) {// completion handler here}它工作正常,我对此没有任何问题。

我不确定是什么导致这种情况发生,一切正常,Android只有面对iOS

4

3 回答 3

3

尝试在install(Logging) 块中设置LogLevel.NONE。 目前我以这种方式解决,因为它似乎是 Ktor 的一个错误。 请参阅:https ://youtrack.jetbrains.com/issue/KTOR-2711 它应该在版本1.6.0中修复。


于 2021-05-27T09:56:47.073 回答
0

你在使用协程库的多线程变体吗?官方文档声明您在使用 Ktor 时应该使用此变体。看这里

于 2021-02-24T05:04:25.373 回答
0

经过所有的努力并尝试了很多调试技巧,我了解到即使我收到来自 api 的响应,也永远不会调用共享模块中的完成处理程序。

我实现的唯一解决方案是使用expectactual机制创建不同的 HTTP 客户端。通过创建单独的客户,我还没有遇到这个问题。

如果您有任何其他答案或解决方案,我很乐意看看。

于 2021-05-03T14:57:43.163 回答