在 200 网络响应上调用 onError 而不是 onNext - RxJava,Retrofit

Posted

技术标签:

【中文标题】在 200 网络响应上调用 onError 而不是 onNext - RxJava,Retrofit【英文标题】:onError is called instead of onNext on 200 network response - RxJava, Retrofit 【发布时间】:2020-02-15 07:29:48 【问题描述】:

正如标题中提到的,当请求以 200 响应时,不会调用 onNext。它会触发 onError。 LogCat 不显示任何错误。我也确信 HTTP 请求会以 200 响应。

这是我的服务接口

interface EnrollmentService 

@POST("enrollment/precheck")
fun sendPhoneNumber(@Body phoneInput: PhoneInputRequest) : Observable<Void>


存储库

class EnrollmentRepository(api : Retrofit) : BaseRepository(api) 
private val service = api.create(EnrollmentService::class.java)

fun sendPhoneNumber(phoneInputRequest: PhoneInputRequest) = service.sendPhoneNumber(phoneInputRequest)


这是 ViewModel 中触发请求的方法:

 fun sendPhoneNumber(phoneNumber: String) 
        if(!isNetworkAvailable(phoneInputResponse))
            return
        compositeDisposable.add(repository.sendPhoneNumber(PhoneInputRequest(PhoneNumber("+48", phoneNumber)))
            .subscribeOn(Schedulers.io())
            .observeOn(androidSchedulers.mainThread())
            .subscribe(
                 phoneInputResponse.postValue(Event(ApiResponse.success(null))),
                error -> phoneInputResponse.postValue(Event(ApiResponse.error(ResponseError.getErrorType(error)))) 
            ))
    

【问题讨论】:

那么错误是什么? @akarnokd 它是 NullPointerException。 200 响应的正文为空。会不会是这个问题? 您的回复类型无效。您必须将 Void 更改为响应的对象。 fun sendPhoneNumber(@Body phoneInput: PhoneInputRequest) : Observable&lt;Any or Your Response Object Class&gt; 您是否尝试使用Observable&lt;Unit&gt; 而不是Observable&lt;Void&gt; Observable 是问题所在。 API 发生了变化,一旦我添加了响应对象,它就起作用了。我没有尝试过,但我认为 Unit 或 Any 可以解决以前的问题。 【参考方案1】:

如果您只是期待 response.code()sendPhoneNumber 方法的 return typeObservable&lt;Void&gt; 更改为 Observable&lt;Response&lt;Void&gt;&gt;

所以,使用:-

fun sendPhoneNumber(@Body phoneInput: PhoneInputRequest) : Observable<Response<Void>>

【讨论】:

以上是关于在 200 网络响应上调用 onError 而不是 onNext - RxJava,Retrofit的主要内容,如果未能解决你的问题,请参考以下文章

Safari 扩展:WebSocket 连接失败调用 onclose 而不是 onerror 并且没有异常

调用 AFNetworking 响应失败块而不是成功块

JavaScript img.src onerror 事件 - 获取错误原因

我所有的网站都返回 301 而不是 200

为啥我的 Github 托管站点响应 HTTP 302 而不是 200?

Ajax 状态为 200 但错误事件触发而不是成功