【问题标题】:Android Retrofit + Rxjava: How to get response on non200 code?Android Retrofit + Rxjava:如何在 non200 代码上获得响应?
【发布时间】:2018-10-08 13:34:39
【问题描述】:

这是我的请求的样子:

ApiService apiService = retrofit.create(ApiService.class);
Observable<Response<UserUpdateResponse>> response = apiService.updateUser(Utils.getHeader(), object);

response.subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::onSuccessUpdate,
                    this::onErr,
                    this::hideDialogLoading);

它应该返回'code':'205' 'msg':'successfully update'。但是,当服务器响应任何代码 201,202(任何不是 200)时,它都会出错。

这是错误。

java.net.ProtocolException: HTTP 205 的 Content-Length: 121 非零

那么我如何防止它出错,或者我如何获得错误正文?谢谢!。

【问题讨论】:

  • 你确定没有其他错误吗?试试retrofitError.getCause()。检查这是否有帮助stackoverflow.com/questions/23107579/…
  • 嗨@Yousefkhan,我正在使用Retrofit2,我需要创建RetrofitError 类吗?
  • 看看github.com/square/retrofit/issues/1218。引用 jake 的评论“构造你的 observable 有三种方法:Observable、Observable> 或 Observable>。对于第一个版本,没有地方可以挂非 200 响应信息,所以它包含在传递给onError的异常中。对于后两者,数据被封装在Response对象中,可以通过调用errorBody()来访问。"
  • 我收到了这个错误 io.reactivex.exceptions.CompositeException: 2 个异常发生。在 io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:80) 在 io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276) 在 io.reactivex.internal.operators .observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172) 在 ...
  • 将上述内容添加到您的问题本身

标签: android retrofit rx-java2 okhttp3


【解决方案1】:

HTTP 响应代码有一个预定义的定义,有些要求它们必须完整才能被视为有效的 HTTP 有效负载。您不能重新定义这些代码对您的应用程序意味着什么,并期望实施良好的客户接受它。

具体看HTTP 205 - Reset Content,有如下要求:

由于 205 状态代码意味着不会提供额外的内容,服务器不得在 205 响应中生成有效负载。

通常,应用程序只会为所有请求返回 HTTP 200,并在负载中包含特定于应用程序的错误代码。你在做什么没有多大意义。

【讨论】:

  • 嗨@Kiskae,感谢您的回复。但是既然文档上说,httpstatuses.com2xx 是成功的,为什么不能提供响应呢?
  • 2xx 仅仅意味着请求完成了它需要做的事情,而不是它发回了完整的响应。
【解决方案2】:

所以从技术上讲,我可以得到响应 2xx。问题是响应代码 205 中的服务器响应正文假定为空 (https://www.rfc-editor.org/rfc/rfc7231#section-6.3.6)。所以在服务器上设置body null后,android端就可以正常工作了。

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 2016-02-19
    • 2021-07-10
    • 2018-01-15
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多