Подтвердить что ты не робот

IOException: "Запрос на получение аутентификации - null" (Apache Harmony/Android)

Я пытаюсь отправить GET через Android HttpURLConnection (импортированный из org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection), и после получения ответа возникает исключение IOException:

in doRequestInternal(): "Запрос на получение аутентификации равен нулю"

Что означает эта ошибка, и что вызывает это? Я пишу параметры OAuth в заголовок авторизации, но я делаю это и в других случаях тоже без проблем.

    if (connection == null) {
        connection = (HttpURLConnection) new URL(endpointUrl).openConnection();
        connection.setRequestMethod("GET");
    }

    //... do some OAuth message signing

    connection.connect();

    int statusCode = connection.getResponseCode(); // throws IOException
4b9b3361

Ответ 1

Я выяснил причину.

Прежде всего, всем, кто не знает, что означает эта ошибка (я не уверен): Это исключение возникает, если сервер отвечает с помощью 401. Очень интуитивно понятно, учитывая, что он был брошен в getResponseCode() (так как вы никогда не можете проверить 401s самостоятельно, но вам придется поймать это IOException вместо этого...).

Фактической причиной для 401 было то, что я не отправил код верификатора OAuth, где он ожидался в этот момент.

Ответ 2

Может быть, будет полезно для кого-то...

Это исключение означает только неправильные заголовки ответов: заголовок "WWW-Authenticate" не найден. Кроме того, chunked ответы с кодом 401 не поддерживаются, поэтому вам понадобится заголовок Content-Length (может быть равен нулю).

Ответ 3

Просто добавьте этот заголовок в запрос (на стороне сервера):

WWW-Authenticate: None

Ответ 4

Обратите внимание, что существует два подхода к аутентификации: HTTP-аутентификация и токен основанная на аутентификации. Если вы используете HTTP-аутентификацию, вам необходимо следовать спецификациям, указанным в ссылке: включить заголовок поля WWW-Authenticate на стороне сервера, использовать java.net.Authenticator локально и т.д. Если вы используете аутентификацию на основе токенов, то, очевидно, вы должны использовать куки файлы для хранения токена и иметь возможность сохранять живые сеансы живыми. В этом случае введите следующий код в android.app.Application.onCreate()

CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);

и вы не будете иметь проблем при получении HTTP 401 с сервера без заголовка WWW-Authenticate.