改造2 - 使用同一请求的内容管理http“204 No content”和“200”

时间:2018-01-10 18:25:54

标签: android retrofit2 dagger-2 rx-java2 okhttp3

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

我正在调用带有一些参数的服务器。根据参数,服务器返回带有对象列表的JSON。但是如果没有什么可以返回的,那么服务器将返回'204 - No Content'而不是返回带有空列表的JSON。结果我得到一个NullPointerException。

我知道如何管理JSON响应,我知道如何管理204响应但不能同时管理同一个呼叫。

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

我该如何处理这个案子?

2 个答案:

答案 0 :(得分:2)

根据@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
    }
}

在演示者

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

答案 1 :(得分:1)

我使用onErrorResumeNext进行错误响应。例如

mSubscription.add(mViewModel.getMyPohybyFromSqlServer("3", drupoh)
            .subscribeOn(Schedulers.computation())
            .observeOn(rx.android.schedulers.AndroidSchedulers.mainThread())
            .doOnError(throwable -> { Log.e(TAG, "Error xxx " + throwable.getMessage());
                hideProgressBar();
                Toast.makeText(getActivity(), "Server not connected", Toast.LENGTH_SHORT).show();
            })
            .onErrorResumeNext(throwable -> empty())
            .subscribe(this::setPohyby));