" OkHttpClient无法转换为MyOkHttpClient"

时间:2016-12-01 21:45:41

标签: java okhttp3

为什么不编译:

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

不兼容的类型。 需要: my.path.util.auth.MyOkHttpClient 实测: okhttp3.OkHttpClient

这是我的班级:

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;
    }


}

1 个答案:

答案 0 :(得分:0)

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

相反,您不必要地扩展OkHttpClient 实现Authenticator接口。您可以使用您想要的任何自定义身份验证器来构建标准的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();