Retrofit 2 - 管理 http “204 No content” 和 “200” 具有相同请求的内容

Ese*_*far 4 android dagger-2 retrofit2 okhttp3 rx-java2

我正在使用 Retrofit 2 和 OkHttp 3,以及 RxJava2

我正在使用一些参数调用服务器。根据参数,服务器返回一个带有对象列表的 JSON。但是如果没有什么可返回,则服务器不会返回带有空列表的 JSON,而是返回“204 - 无内容”。结果我得到一个 NullPointerException。

我知道如何管理 JSON 响应,我知道如何管理 204 响应,但不能一起管理同一个调用。

我可以使用拦截器,但由于我有很多调用,我的 Retrofit 客户端创建一次,然后在必要时使用 Dagger2 注入。

我该如何处理这个案例?

Ese*_*far 6

根据@eurosecom 的建议,我已经解决了我的问题,如下所述。唯一的问题是我希望来自服务器的“无内容”响应由 Retrofit 管理为“成功”,但使用此解决方案,它仍然作为错误进行管理。

改造客户端

return new OkHttpClient.Builder()
    .addInterceptor(new GeneralInterceptor(callback))
    .build


private static class GeneralInterceptor implements Interceptor {

    //... 

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request originalRequest = chain.request();
        Request.Builder requestBuilder = originalRequest.newBuilder();
        Response response = chain.proceed(requestBuilder.build());

        // Throw specific Exception on HTTP 204 response code
        if (response.code() == 204) {
            throw new NoContentException("There is no content");
        }

        return response; // Carry on with the response
    }
}
Run Code Online (Sandbox Code Playgroud)

在演示者中

mModel.performRequest()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .onErrorResumeNext(throwable -> {
        if (throwable instanceof NoContentException) {
            return Observable.empty();
        }

        return Observable.error(throwable);
    })
    .subscribe(res -> {
        //... Manage the result
    }, throwable -> {
        //... On error
    }
);
Run Code Online (Sandbox Code Playgroud)

  • 为什么不返回修改后的 Response 对象(使用 ```response.newBuilder()```)并更改响应代码并添加一个空主体?```if (response.code() == 204) { response = response.newBuilder() .code(200) .body(ResponseBody.create(MediaType.parse("application/json"), "[]") ) .build() }``` ? (2认同)