OKHttp身份验证器自定义HTTP代码而不是401和407

时间:2017-03-24 08:06:29

标签: authentication retrofit2 okhttp3 okhttp

我在服务器端实现了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并在其中继续我们的逻辑。 谢谢

1 个答案:

答案 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...
    }
}

请仅将此解决方案作为最后手段使用。