IOException: "полученный вызов аутентификации равен null "( Apache Harmony / Android)

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

в doRequestInternal (): "полученный вызов аутентификации равен null"

что означает эта ошибка, и что вызывает это? Я пишу параметры 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

4 ответов


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

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

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


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

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


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

WWW-Authenticate: None

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

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

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