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" (может быть равен нулю).
обратите внимание, что существует два подхода аутентификации:аутентификация HTTP и аутентификация на основе токенов. Если вы используете аутентификацию HTTP, вы должны следовать ссылочной спецификации: include WWW-аутентификация поля заголовка на стороне сервера, используйте java.net.Authenticator
локально, и т. д. Если вы используете аутентификацию на основе токенов, то, очевидно, вы должны использовать cookies для хранения токена и сохранения долгоживущих сеансов. В таких случай поставил следующий код в android.app.Application.onCreate()
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
и у вас не будет проблем при получении HTTP 401 с сервера без WWW-аутентификация поля заголовка.