Пользовательский http-код OKHttp Authenticator, отличный от 401 и 407

У меня есть токен oauth, реализованный на стороне сервера, но по истечении срока действия недействительного токена или токена я получаю код состояния 200 http, но в теле ответа у меня {"code":"4XX", "data":{"some":"object"} Когда я пытаюсь прочитать строку в interceptor, я получаю okhttp dispatcher java.lang.illegalstateexception closed, потому что response.body().string() нужно вызывать только один раз.

Также я читал отсюда Обновление токена OAuth с использованием дооснащения без изменения всех вызовов, мы можем использовать класс OkHttp Authenticator, но он работает только с 401/407, я не пробовал, так как я этого не получу. Есть ли способ настроить Authenticator и продолжить нашу логику внутри него. Спасибо


person silentsudo    schedule 24.03.2017    source источник


Ответы (1)


Если возможно, попробуйте поговорить со стороной вашего сервера о кодах ответа. Общение - тоже очень важный навык.

Если это невозможно, вы можете изменить коды ответов вручную с отражением, это включает логику аутентификации 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...
    }
}

Пожалуйста, используйте это решение только в крайнем случае.

person Anrimian    schedule 28.12.2017
comment
Я согласен, но поскольку другие системы построены с использованием только старого кода ответа, поэтому для них это невозможно изменить, я уже сделал это с помощью синтаксического анализа ... но вместо этого снова используется два способа синтаксического анализа. Это пустая трата времени. В любом случае спасибо за ответ. - person silentsudo; 28.12.2017