"OkHttpClient cannot be converted to MyOkHttpClient"

"OkHttpClient cannot be converted to MyOkHttpClient"

为什么编译不了:

MyOkHttpClient okClient = new MyOkHttpClient.Builder()
                .addInterceptor(new AddCookiesInterceptor())
                .addInterceptor(new ReceivedCookiesInterceptor()).build();

不兼容的类型。 必需的: my.path.util.auth.MyOkHttpClient 成立: okhttp3.OkHttpClient

这是我的 class:

public class MyOkHttpClient extends okhttp3.OkHttpClient implements Authenticator {

    private static int MAX_AUTHENTICATE_TRIES = 3;



    @Override
    public Request authenticate(Route route, Response response) throws IOException {
        if (responseCount(response) >= MAX_AUTHENTICATE_TRIES) {
            return null; // If we've failed 3 times, give up. - in real life, never give up!!
        }
        String credential = Credentials.basic(AUTHTOKEN_USERNAME, AUTHTOKEN_PASSWORD);
        return response.request().newBuilder().header("Authorization", credential).build();
    }

    private int responseCount(Response response) {
        int result = 1;
        while ((response = response.priorResponse()) != null) {
            result++;
        }
        return result;
    }


}

根据您的评论,您错误地认为您正在使用自定义身份验证逻辑装饰 OkHttpClient。

相反,您不必要地扩展了实现 Authenticator 接口的 OkHttpClient 。您可以使用您想要的任何自定义身份验证器简单地构建标准 OkHttpClient。

因此,这个更像你真正想要的

public class MyAuthenticator implements Authenticator {

    private static int MAX_AUTHENTICATE_TRIES = 3;

    @Override
    public Request authenticate(Route route, Response response) throws IOException {
        if (responseCount(response) >= MAX_AUTHENTICATE_TRIES) {
            return null; // If we've failed 3 times, give up. - in real life, never give up!!
        }
        String credential = Credentials.basic(AUTHTOKEN_USERNAME, AUTHTOKEN_PASSWORD);
        return response.request().newBuilder().header("Authorization", credential).build();
    }

    private int responseCount(Response response) {
        int result = 1;
        while ((response = response.priorResponse()) != null) {
            result++;
        }
        return result;
    }


}

然后当您构建客户端时

OkHttpClient okClient = new OkHttpClient.Builder()
            .addInterceptor(new AddCookiesInterceptor())
            .addInterceptor(new ReceivedCookiesInterceptor())
            .authenticator(new MyAuthenticator())
            .build();