继续使用Api响应Ktor



我正在尝试使用Ktor为我们的apisservices构建一个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 
})
}
}

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

只要我改变我的屏幕或关闭应用程序,并尝试调用相同的api,然后它工作良好。

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

我不确定是什么原因导致这种情况发生,在Android中一切都很好,这只面对iOS

尝试设置LogLevel。没有一个安装(日志)块.
目前我以这种方式解决,因为它似乎是Ktor的一个bug。
参见:https://youtrack.jetbrains.com/issue/KTOR-2711
应该在1.6.0版本中修复.

您正在使用协程库的多线程变体吗?官方文档指出,在使用Ktor时应该使用这个变体。看到

经过所有的努力和尝试了很多调试技巧后,我明白了我的完成处理程序在共享模块中永远不会被调用,即使我从api收到响应。

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

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

最新更新