gpt4 book ai didi

android - OKHttp Authenticator 不适用于 Retrofit 暂停乐趣

转载 作者:行者123 更新时间:2023-11-29 14:11:57 24 4
gpt4 key购买 nike

我最近将 Retrofit 更新到 2.7.0 并将 OKHttp 更新到 3.14.4 以利用 Retrofit 界面上的暂停乐趣。

除此之外,我还尝试为刷新 token 逻辑实现 Authenticator。

这是 retrofit 界面

interface OfficeApi {
@Authenticated
@POST
suspend fun getCharacter(): Response<CharacterResponse>
}

这是我的身份验证器

class CharacterAuthenticator : Authenticator {

override fun authenticate(
route: Route?,
response: Response
): Request? {
if (responseCount(response) >= 2) return null

return response.request()
.newBuilder()
.removeHeader("Authorization")
.addHeader("Authorization", "Bearer $newToken")
.build()

return null
}

private fun responseCount(response: Response?): Int {
var result = 1
while (response?.priorResponse() != null) result++
return result
}

}

这是改造有趣的电话

    override suspend fun getCharacter() = safeApiCall(moshiConverter) {
myApi.getCharacter()
}

这是safeApiCall:

suspend fun <T> safeApiCall(
moshiConverter: MoshiConverter,
apiCall: suspend () -> Response<T>
): Result<T?, ResultError.NetworkError> {
return try {
val response = apiCall()
if (response.isSuccessful) Result.Success(response.body())
else {
val errorBody = response.errorBody()
val errorBodyResponse = if (errorBody != null) {
moshiConverter.fromJsonObject(errorBody.string(), ErrorBodyResponse::class.java)
} else null

Result.Error(
ResultError.NetworkError(
httpCode = response.code(),
httpMessage = response.message(),
serverCode = errorBodyResponse?.code,
serverMessage = errorBodyResponse?.message
)
)
}
} catch (exception: Exception) {
Result.Error(ResultError.NetworkError(-1, exception.message))
}
}

Authenticator 正常工作,尝试刷新 token 两次然后放弃。问题是:当它放弃(返回 null)时,改造(safeApiCall 函数)的执行不会继续。通话成功与否,我没有任何反馈。

使用 Authenticator 和 Coroutines suspend fun 有什么问题吗?

最佳答案

这不是死循环吗?

while (response?.priorResponse() != null)

不应该吗

var curResponse: Response? = response
while (curResponse?.priorResponse() != null) {
result++
curResponse = curResponse.priorResponse()
}

关于android - OKHttp Authenticator 不适用于 Retrofit 暂停乐趣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59290729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com