Android Retrofit + Rxjava:如何获取非200代码的响应?

Android Retrofit + Rxjava: How to get response on non200 code?

我的请求是这样的:

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);

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

这是错误。

java.net.ProtocolException: HTTP 205 had non-zero Content-Length: 121

那么如何防止错误,或者如何获取错误正文?谢谢!

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

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

Since the 205 status code implies that no additional content will be provided, a server MUST NOT generate a payload in a 205 response.

一般来说,应用程序只会 return 为所有请求发送 HTTP 200,并在负载中包含特定于应用程序的错误代码。你在做什么没有多大意义。

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