OKHttp docs によると、基本認証リクエストで使用OkHttp 2.3
していますが、認証されていないリクエストを自動的に再試行しますが、無効な資格情報を提供するたびに、リクエストに時間がかかりすぎて、最終的にこの例外が発生します:
java.net.ProtocolException: フォローアップ要求が多すぎます: 21
OkHttp が認証されていないリクエストを自動的に再試行するのを防ぎ、401 Unauthorized
代わりに返すにはどうすればよいですか?
OKHttp docs によると、基本認証リクエストで使用OkHttp 2.3
していますが、認証されていないリクエストを自動的に再試行しますが、無効な資格情報を提供するたびに、リクエストに時間がかかりすぎて、最終的にこの例外が発生します:
java.net.ProtocolException: フォローアップ要求が多すぎます: 21
OkHttp が認証されていないリクエストを自動的に再試行するのを防ぎ、401 Unauthorized
代わりに返すにはどうすればよいですか?
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 回試行した後、例外をスローします。
機能する 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();
それでおしまい。