12

OKHttp docs によると、基本認証リクエストで使用OkHttp 2.3していますが、認証されていないリクエストを自動的に再試行しますが、無効な資格情報を提供するたびに、リクエストに時間がかかりすぎて、最終的にこの例外が発生します:

java.net.ProtocolException: フォローアップ要求が多すぎます: 21

OkHttp が認証されていないリクエストを自動的に再試行するのを防ぎ、401 Unauthorized代わりに返すにはどうすればよいですか?

4

2 に答える 2

15
protected Authenticator getBasicAuth(final String username, final String password) {
    return new Authenticator() {
        private int mCounter = 0;

        @Override
        public Request authenticate(Proxy proxy, Response response) throws IOException {
            if (mCounter++ > 0) {
                throw new AuthenticationException(
                        AuthenticationException.Type.INVALID_LOGIN, response.message());
            }

            String credential = Credentials.basic(username, password);
            return response.request().newBuilder().header("Authorization", credential).build();
        }

        @Override
        public Request authenticateProxy(Proxy proxy, Response response) throws IOException {
            return null;
        }
    };
}

私の Authenticator では、単純に試行回数を数えます。X 回試行した後、例外をスローします。

于 2015-04-17T08:52:26.240 に答える
2

機能する Traxdata の回答の修正版:

protected Authenticator getBasicAuth(final String username, final String password) {
    return new Authenticator() {
        private int mCounter = 0;

        @Override
        public Request authenticate(Route route, Response response) throws IOException {
            Log.d("OkHttp", "authenticate(Route route, Response response) | mCounter = " + mCounter);
            if (mCounter++ > 0) {
                Log.d("OkHttp", "authenticate(Route route, Response response) | I'll return null");
                return null;
            } else {
                Log.d("OkHttp", "authenticate(Route route, Response response) | This is first time, I'll try to authenticate");
                String credential = Credentials.basic(username, password);
                return response.request().newBuilder().header("Authorization", credential).build();
            }
        }
    };
}

次に、次のことを行う必要があります。

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.authenticator(getBasicAuth("username", "pass"));
retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(builder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

それでおしまい。

于 2016-08-26T09:39:51.990 に答える