Consuming One-Shot ResponseBody from Okhttp causes issues with Retrofit
我正在使用带有Okhttp拦截器的Retrofit,以便检测我的oauth令牌是否已过期。 如果令牌已过期,我想请求一个新令牌,再次尝试该请求,然后将该响应发送给Retrofit。
这是我的拦截器类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class CustomInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // try the request Response response = chain.proceed(request); if (response.body().string().contains(Constants.TOKEN_AUTH_ERROR_MESSAGE)) { Log.v("retrofit_error","token expired"); //get current token, create headers OAuthTokenResponse expiredToken = SharedPreferencesUtil.getOAuthToken(); OAuthTokenResponse newOauthToken = RestClient.getInstance().getTokenService().refreshOauthToken(expiredToken.getRefreshToken()); //store new token, return SharedPreferencesUtil.saveOAuthToken(newOauthToken); // create a new request and modify it accordingly using the new token Request.Builder newRequestBuilder = request.newBuilder() .removeHeader("Authorization"); Request newRequest = newRequestBuilder.addHeader("Authorization", SharedPreferencesUtil.getOAuthToken().getAccessToken()).build(); // retry the request return chain.proceed(newRequest); } // otherwise just pass the original response on return response; } } |
问题在于,调用response.body.string()将消耗ResponseBody,因为它是Okhttp文档状态的一次性值。
这意味着,在代码末尾返回的Response不再传递给主体进行改装时。 有什么方法可以消耗身体,同时仍将其返回响应吗?
谢谢!
我通过使用Response.Builder创建一个新的响应来实现这一点。 我可以使用
1 2 3 4 5 6 7 8 9 10 | Request request = chain.request(); Response response = chain.proceed(request); ResponseBody responseBody = response.body(); String responseBodyString = response.body().string(); Response newResponse = response.newBuilder().body(ResponseBody.create(responseBody.contentType(), responseBodyString.getBytes())).build(); ... return newResponse; |
您可以使用测井拦截器
https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor