модификация и okhttpclient перехватывают ответ 401

Я пытаюсь увидеть, когда я получаю ответ от своего API с кодом 401. Но когда я это делаю, я получаю IOException

@Override
public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();
    Response response = chain.proceed(request);
    if (response.code() == 401) {
        mLoginToken.delete();
        Toast.makeText(mApplication.getApplicationContext(), R.string.session_error, Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(mApplication.getApplicationContext(), LoginActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        mApplication.startActivity(intent);
    }
    return response;
}

Я получу сообщение об ошибке java.io.IOException: неожиданный конец потока в Connection{ proxy=DIRECT@ hostAddress= cipherSuite=none protocol=http/1.1} (счетчик повторов=0)

На линии

        Response response = chain.proceed(request);

Как я должен получить ответы с 401 (несанкционированный код), чтобы справиться с этим?


person Boldijar Paul    schedule 27.02.2016    source источник


Ответы (2)


Обычно я использую перехватчики только для запросов, а для обработки ошибок устанавливаю обработчик ошибок в построителе остальных адаптеров, см. пример ниже:

Примечание: cause.getResponse() может вернуть null

   yourRestAdapterBuilder.setErrorHandler(new ErrorHandler() {
                        @Override
                        public Throwable handleError(RetrofitError cause) {
                            switch (cause.getResponse().getStatus()) {
                                case 401:
                                    mLoginToken.delete();
                                    Toast.makeText(mApplication.getApplicationContext(), R.string.session_error, Toast.LENGTH_SHORT).show();
                                    Intent intent = new Intent(mApplication.getApplicationContext(), LoginActivity.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                                    mApplication.startActivity(intent);
                                default:
                                    // suppress or handle other errors
                                    break;
                            }
                        }
                    })
person Kevin Crain    schedule 27.02.2016
comment
Есть ли другой обработчик ошибок по умолчанию, и если я установлю новый, возникнут проблемы в будущем? - person Boldijar Paul; 28.02.2016
comment
Если я не ошибаюсь, установка другого обработчика ошибок просто переопределит ранее установленный обработчик ошибок, и я не уверен, насколько сложной вы хотите, чтобы ваша обработка ошибок была, вы всегда можете абстрагировать блок кода case в статические функции, чтобы поддерживать читаемость в вашем код - person Kevin Crain; 28.02.2016
comment
Спасибо, что поделились этим решением. Мне это нравится ;) - person andrea.rinaldi; 10.11.2017

val contentType = response.body?.contentType()
        val charset: Charset = contentType?.charset(StandardCharsets.UTF_8) ?: StandardCharsets.UTF_8
        val message= response.body?.source()?.readString(charset)

Это работает для меня и во благо

person phan piseth    schedule 04.09.2020