我在服务器端实现了oauth令牌,但在无效令牌或令牌过期时,我得到了200Http状态码,但在响应体中,当我试图读取interceptor中的字符串时,我得到了{"code":"4XX", "data":{"some":"object"},因为response.body().string()只能被调用一次。
另外,我从这里读到Refreshing OAuth token using Retrofit without modifying all calls,我们可以使用OkHttp验证器类,但它只适用于401/407,我还没有尝试过,因为我不会得到这个。我们有没有办法定制Authenticator,并在其中继续我们的逻辑。谢谢
发布于 2017-12-28 15:20:28
如果可能,尝试与您的服务器端讨论响应代码。沟通也是一项非常重要的技能。
如果不可能,您可以手动修改响应代码与反射,它启用okHttp身份验证逻辑。
public OkHttpClient getOkHttpClient() {
return new OkHttpClient.Builder()
.authenticator((route, response) -> {
System.out.println("it working");
return null;
})
.addNetworkInterceptor(new UnauthorizedCaseParserInterceptor())
.build();
}
public class UnauthorizedCaseParserInterceptor implements Interceptor {
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
if (isUnauthorizedResponse(response)) {
try {
Field codeField = response.getClass().getDeclaredField("code");
codeField.setAccessible(true);
codeField.set(response, HttpURLConnection.HTTP_UNAUTHORIZED);
} catch (Exception e) {
return response;
}
}
return response;
}
private boolean isUnauthorizedResponse(Response response) {
//parse response...
}
}请仅在万不得已的情况下使用此解决方案。
https://stackoverflow.com/questions/42994353
复制相似问题