IOException: «Полученный запрос аутентификации является нулевым» (Apache Harmony / Android) - PullRequest
35 голосов
/ 31 августа 2009

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

в doRequestInternal (): «Получен запрос проверки подлинности нулевой»

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

    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

Ответы [ 4 ]

50 голосов
/ 31 августа 2009

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

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

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

13 голосов
/ 19 марта 2012

Может быть кому-нибудь пригодится ...

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

4 голосов
/ 24 февраля 2014

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

WWW-Authenticate: None
2 голосов
/ 26 мая 2014

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

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

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

...