其他分享
首页 > 其他分享> > android-Retrofit 2-使用相同请求的内容管理http“ 204无内容”和“ 200”

android-Retrofit 2-使用相同请求的内容管理http“ 204无内容”和“ 200”

作者:互联网

我正在将Retrofit 2和OkHttp 3与RxJava2一起使用

我正在使用一些参数调用服务器.服务器根据这些参数返回带有对象列表的JSON.但是,如果没有要返回的内容,则服务器将返回’204-No Content’,而不是返回带有空列表的JSON.结果,我得到一个NullPointerException.

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

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

如何处理此案?

解决方法:

基于@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
    }
);

标签:rx-java2,okhttp3,retrofit2,dagger-2,android
来源: https://codeday.me/bug/20191025/1928635.html