Android OkHttp 3非法状态异常

Android OkHttp 3非法状态异常,android,okhttp,Android,Okhttp,我定制了一个拦截器,以便在令牌过期时刷新它。当我让响应体检测令牌是否过期时,它抛出java.lang.IllegalStateException:closed 这是我使用OkHttp 3的代码 @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); Request.Builder requestBuilder = origin

我定制了一个拦截器,以便在令牌过期时刷新它。当我让响应体检测令牌是否过期时,它抛出java.lang.IllegalStateException:closed

这是我使用OkHttp 3的代码

@Override
public Response intercept(Chain chain) throws IOException {
    Request original = chain.request();
    Request.Builder requestBuilder = original.newBuilder()
            .header("Content-Type", "application/json")
            .header(Constants.TAG_AUTHORIZATION, "Bearer " + token)
            .method(original.method(), original.body());


    Request request = requestBuilder.build();
    Response response = chain.proceed(request);
    if (response.code() == 200) {
        String json = response.body().string();
        try {
            JSONObject obj = new JSONObject(json);
            int code = obj.getInt(Constants.TAG_CODE);
            if (code == Constants.REQUEST_CODE_TOKEN_EXPIRED) {
                Response r = makeTokenRefreshCall(request, chain);
                return r;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return response;
}

请帮帮我

您不允许在拦截器中使用响应主体。如果您想解决这个问题,请使用
Response.peek body()
,它可以制作一个允许您阅读的副本。

最后,我找到了一个毫无例外地阅读响应正文的解决方案

 ResponseBody body = response.body();
 BufferedSource source = body.source();
 if (source.request(1024)) throw new IOException("Body too long!");
 Buffer bufferedCopy = source.buffer().clone();
 ResponseBody newBody = ResponseBody.create(body.contentType(), body.contentLength(), bufferedCopy);
 String responseBodyString = newBody.string();

例外情况是什么?展示logcat@matrixintercept()中没有抛出异常,但在我的RxJava onError()方法中抛出异常。peekBody还抛出IllegalStateExceptionResponseBody responseBodyCopy=response.peekBody(Long.MAX_值);responseByCopy.string();我明白这不仅是可能的,而且很容易,而且没有很大的效率权衡。在这样一个图书馆里省略是既容易又合理的。谢谢你@jesse wilsonThis崩溃与非法状态例外