java.io.IOException: полученный запрос аутентификации имеет значение null в ICS 4.0.3

Пытаюсь выйти с сервера. Но он возвращает код ответа «0» с этим исключением. Я использую глагол GET для этого.

Логкат

10-17 14:54:13.261: W/System.err(868): java.io.IOException: Received authentication challenge is null
10-17 14:54:13.284: W/System.err(868):  at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:397)
10-17 14:54:13.284: W/System.err(868):  at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:345)
10-17 14:54:13.304: W/System.err(868):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:276)
10-17 14:54:13.324: W/System.err(868):  at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479)
10-17 14:54:13.324: W/System.err(868):  at com.remote.synchronizer.haris.CustomHttpClient.executeGet(CustomHttpClient.java:131)
10-17 14:54:13.354: W/System.err(868):  at com.remote.synchronizer.haris.OptionsActivity$1$3$1.run(OptionsActivity.java:87)
10-17 14:54:13.364: W/System.err(868):  at android.os.Handler.handleCallback(Handler.java:605)
10-17 14:54:13.384: W/System.err(868):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-17 14:54:13.384: W/System.err(868):  at android.os.Looper.loop(Looper.java:137)
10-17 14:54:13.404: W/System.err(868):  at android.app.ActivityThread.main(ActivityThread.java:4424)
10-17 14:54:13.424: W/System.err(868):  at java.lang.reflect.Method.invokeNative(Native Method)
10-17 14:54:13.424: W/System.err(868):  at java.lang.reflect.Method.invoke(Method.java:511)
10-17 14:54:13.454: W/System.err(868):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-17 14:54:13.474: W/System.err(868):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-17 14:54:13.474: W/System.err(868):  at dalvik.system.NativeStart.main(Native Method)
10-17 14:54:13.484: E/HTTP Response(868): java.io.IOException: Received authentication challenge is null

CustomHttpClient.java

public class CustomHttpClient {

    static HttpClient client = new DefaultHttpClient();
    static HttpURLConnection connection = null; 

    public static int executePost(String url, String postParameters)
    {
        int response=0;

        OutputStream output = null;
        try
        {
            connection = (HttpURLConnection)new URL(url).openConnection();
            System.setProperty("http.keepAlive", "false");
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept-Charset", "UTF-8");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");

            connection.connect();

            output = connection.getOutputStream();
            output.write(postParameters.getBytes("UTF-8"));

            response=connection.getResponseCode();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            Log.e("HTTP Response", e.toString());
        }
        finally {
            if(connection != null) {
                //  connection.disconnect(); 
                if (output != null) 
                    try { output.close(); } 
                catch (IOException logOrIgnore) {}
            }
        }

        return response;
    }

    public static int executeGet(String url)
    {
        int response=0;

        //HttpURLConnection connection = null;
        try
        {
            connection = (HttpURLConnection) new URL(url).openConnection();
            System.setProperty("http.keepAlive", "false");
            //connection.setRequestProperty("Accept-Charset", "UTF-8");
            connection.setDoInput(true);
            connection.setRequestMethod("GET");
            connection.connect();
            response=connection.getResponseCode();
        } 
        catch(Exception e)
        {
            e.printStackTrace();
            Log.e("HTTP Response", e.toString());
        }
        finally {
            if(connection != null) {
                //  connection.disconnect();
            }
        }
        return response;
    }

}

До этого я использую DefaultHTTPClient в Gingerbird 2.3, он работает отлично, но в ICS DefaultHTTPClient не работает, поэтому мне нужно использовать HttpURLConnection. Глагол POST работает нормально.


person Haris    schedule 17.10.2012    source источник
comment
Пожалуйста, посмотрите мой ответ и +1 / принять, если вам это нравится!   -  person Erik Zivkovic    schedule 12.04.2013
comment
вы, вероятно, видели это, но стоит поделиться stackoverflow.com/questions/11810447/   -  person Emmanuel    schedule 03.09.2013


Ответы (3)


Вы можете получить код ответа после исключения, если вы вызовете .getResponseCode() во второй раз для объекта соединения. Это связано с тем, что при первом вызове .getResponseCode() устанавливается внутреннее состояние, которое позволяет .getResponseCode() возвращаться без создания исключения.

Пример:

HttpURLConnection connection = ...;
try {
    // Will throw IOException if server responds with 401.
    connection.getResponseCode(); 
} catch (IOException e) {
    // Will return 401, because now connection has the correct internal state.
    int responsecode = connection.getResponseCode(); 
}

Я также ответил на этот вопрос здесь: https://stackoverflow.com/a/15972969/816017

person Erik Zivkovic    schedule 12.04.2013

HttpURLConnection.getResponseCode() выдает java.io.IOException: Received authentication challenge is null при обнаружении неправильно сформированного заголовка HTTP 401. Получаете ли вы заголовки WWW-Authenticate и Content-Length с сервера в дополнение к заголовку HTTP/1.1 401 Unauthorized? См. IOException: полученный запрос проверки подлинности имеет значение null (Apache Harmony/Android)

Если вы не можете внести изменения в сервер, вы можете поймать это исключение (спасибо https://stackoverflow.com/a/10904318/262462)

try {
    response=connection.getResponseCode();
}
catch (java.io.IOException e) {
    if (e.getMessage().contains("authentication challenge")) {
        response = HttpsURLConnection.HTTP_UNAUTHORIZED;
    } else { throw e; }
}
person Kuitsi    schedule 09.11.2012

Эта ошибка возникает из-за того, что сервер отправляет 401 (неавторизованный), но не дает «WWW-аутентификацию», которая является подсказкой для клиента, что делать дальше. Заголовок «WWW-Authenticate» сообщает клиенту, какой тип аутентификации необходим (либо Basic, либо Дайджест). Обычно это не очень полезно в безголовых http-клиентах, но именно так определяется стандарт. Ошибка возникает из-за того, что библиотека пытается проанализировать заголовок «WWW-Authenticate», но не может.

Возможные решения, если вы можете изменить сервер:

  • Добавьте поддельный заголовок «WWW-Authenticate», например: WWW-Authenticate: Basic realm="fake". Это просто обходной путь, а не решение, но он должен работать, и http-клиент доволен.
  • Используйте код состояния HTTP 403 вместо 401. Его семантика отличается, и обычно при работе с логином 401 является правильным ответом (см. здесь для подробного обсуждения), но это достаточно близко.

Возможные решения, если вы не можете изменить сервер:

Как написал @ErikZ в своем post вы можете использовать try&catch

HttpURLConnection connection = ...;
try {
    // Will throw IOException if server responds with 401.
    connection.getResponseCode(); 
} catch (IOException e) {
    // Will return 401, because now connection has the correct internal state.
    int responsecode = connection.getResponseCode(); 
}

Я также разместил это здесь: java.io.IOException: нет аутентификации обнаружены проблемы

person Patrick Favre    schedule 03.02.2014