我在服务器端实现了oauth令牌,但是在无效令牌或令牌expirey上我得到200个http状态代码但是在响应正文中我有
{"code":"4XX", "data":{"some":"object"}
当我尝试在interceptor
中读取字符串时,我得到okhttp dispatcher java.lang.illegalstateexception closed
因为response.body().string()
必须只调用一次。
另外我从这里Refreshing OAuth token using Retrofit without modifying all calls读到我们可以使用OkHttp Authenticator类,但它只适用于401/407我没试过,因为我不会得到这个。我们有什么方法可以自定义Authenticator并在其中继续我们的逻辑。 谢谢
答案 0 :(得分:0)
如果可能,请尝试与服务器端讨论响应代码。沟通也是一项非常重要的技能。
如果它是不可能的,你可以用反射手动修改响应代码,它启用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...
}
}
请仅将此解决方案作为最后手段使用。