无法访问ResponseBody的字符串表示形式

时间:2018-01-10 09:56:06

标签: android interceptor okhttp3

我有一个拦截器来监视我收到的所有服务器响应。在这个拦截器中,我想访问响应体,然后是这个响应体的字符串表示。

我的问题是string()方法返回IllegalStateException。

Interceptor authorizationInterceptor = chain -> {
        Request request = chain.request();
        Response response = chain.proceed(request);

        if (response != null) {
            // This is a Nullable
            ResponseBody responseBody = response.body();

            if (responseBody != null) {
                // This fails with an IllegalStateException and I cannot retrieve the string
                String responseBodyString = responseBody.string();
            }
            return response;
        } else {
            // Should not happen
            Timber.w("Cannot get the server response as a Response object");
        }


        return response;
};

但是如果我执行以下操作,我可以检索字符串值:

String responseBodyString = response.body().string();

但是我不再受到response.body()的保护,因为它是空的......

我知道身体无法阅读more than once但我不认为这与我的问题有关。

如何确保响应正文不为null,然后获取此响应正文的字符串表示形式?

修改

这是stacktrace:

java.lang.IllegalStateException: closed
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:398)
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:392)
at okhttp3.internal.Util.bomAwareCharset(Util.java:431)
at okhttp3.ResponseBody.string(ResponseBody.java:174)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:211)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
at okhttp3.RealCall.execute(RealCall.java:69)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:41)
at io.reactivex.Observable.subscribe(Observable.java:10910)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
at io.reactivex.Observable.subscribe(Observable.java:10910)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)

1 个答案:

答案 0 :(得分:0)

这可能会对你有帮助。

* successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs