gpt4 book ai didi

android - 未为 Http 状态代码 400 调用 Kotlin RxJava2 onError

转载 作者:行者123 更新时间:2023-11-29 18:46:09 25 4
gpt4 key购买 nike

我在我正在开发的 Android 应用程序中使用 RxJava2 和 Retrofit 以及 OkHttp。

对于这个应用程序,我使用的是 Kotlin,但不管是 Java 还是 Kotlin 都没有区别。

在我以前开发的应用程序中,当服务器返回 400 错误代码时,将调用 onError 回调。然而,今天在处理此设置时,onError 回调仅在例如服务器关闭时触发,但即使是 400 错误代码也会调用 onNext

下面是我的设置摘录

/**
* Networking
*/
implementation "com.squareup.okhttp3:okhttp:3.11.0"
implementation "com.squareup.okhttp3:logging-interceptor:3.11.0"
implementation "com.squareup.retrofit2:retrofit:2.4.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0"
/**
* Rx
*/
implementation "io.reactivex.rxjava2:rxandroid:2.0.2"
implementation "io.reactivex.rxjava2:rxkotlin:2.2.0"

这是实际构建 retrofit 对象的 dagger2 模块的摘录

    @Singleton
@Provides
fun provideRetrofit(okHttpClient: OkHttpClient,
gson: Gson,
@BaseUrl baseUrl: String): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
}

这是调用API的实际代码

fun loginUser(username: String, password: String): MutableLiveData<Result> {
if (username.isNotBlank() && password.isNotBlank()) {
subscriptions.addAll(remoteUserRepository
.getUser(UserDto(username, password))
.subscribeBy(onNext = {
saveUser(it.body())
saveAuthenticationToken(it.headers().get("token"))
}, onError = { handleError(it) }))
}
return resultLiveData
}

private fun saveUser(user: User?) {
user?.let {
localUserRepository.saveUser(it)
resultLiveData.value = Result.SUCCESS
}
}

private fun saveAuthenticationToken(token: String?) {
token?.let { localUserRepository.saveToken(it) }
}

override fun handleError(error: Throwable) {
super.handleError(error)
resultLiveData.value = Result.FAILURE
}

这是来自对服务器的请求和响应的日志,清楚地表明服务器正在返回 HTTP 代码 401

   D/OkHttp: --> POST http://10.0.2.2:3000/login http/1.1
Content-Type: application/json; charset=UTF-8
D/OkHttp: Content-Length: 48
Host: 10.0.2.2:3000
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.11.0
--> END POST
D/OkHttp: <-- 401 Unauthorized http://10.0.2.2:3000/login (20ms)
content-type: application/json; charset=utf-8
cache-control: no-cache
content-length: 94
Date: Mon, 13 Aug 2018 13:55:07 GMT
Connection: keep-alive
<-- END HTTP

即使服务器返回 401 错误,也不会调用 handleError(error: Throwable) 回调。它仅在服务器无法访问时调用。

我错过了什么?

最佳答案

onError 会捕获由于执行任务或处理结果而发生的错误。

在你的情况下, retrofit 电话没问题。

你必须处理响应的结果:在您的 onSuccess 中检查响应是否 isSuccessful 并继续

关于android - 未为 Http 状态代码 400 调用 Kotlin RxJava2 onError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824557/

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