6

サーバーからログオフしようとしています。ただし、この例外では「0」の応答コードが返されます。これを行うためにGET動詞を使用しています。

LogCat

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;
    }

}

この前に、Gingerbird 2.3 で DefaultHTTPClient を使用していますが、完全に機能していますが、ICS では DefaultHTTPClient が機能していないため、HttpURLConnection を使用する必要があります。POST動詞は正常に機能しています。

4

3 に答える 3

3

HttpURLConnection.getResponseCode()java.io.IOException: Received authentication challenge is null不正な形式の HTTP 401 ヘッダーが検出された場合にスローされます。ヘッダーに加えてサーバーからヘッダーWWW-Authenticateを受け取りますか? IOException: "Received authentication challenge is null" (Apache Harmony/Android)を参照してください。Content-LengthHTTP/1.1 401 Unauthorized

サーバーに変更を加えることができない場合は、その例外をキャッチできます (ありがとう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; }
}
于 2012-11-09T11:40:52.343 に答える
1

このエラーは、サーバーが 401 (Unauthorized) を送信するが、クライアントが次に何をすべきかのヒントである "WWW-Authenticate" を提供しないために発生します。「WWW-Authenticate」ヘッダーは、必要な認証の種類 ( BasicまたはDigest ) をクライアントに通知します。これは通常、ヘッドレス http クライアントではあまり役に立ちませんが、標準はこのように定義されています。ライブラリが「WWW-Authenticate」ヘッダーを解析しようとしましたが、解析できないため、エラーが発生します。

サーバーを変更できる場合の解決策:

  • 次のような偽の「WWW-Authenticate」ヘッダーを追加しますWWW-Authenticate: Basic realm="fake"。これは単なる回避策であり、解決策ではありませんが、うまくいくはずであり、http クライアントは満足しています。
  • 403の代わりにHTTP ステータス コードを使用します401。そのセマンティックは同じではなく、通常、ログイン 401 を使用する場合は正しい応答です (詳細な説明については、こちらを参照してください) が、十分に近いです。

サーバーを変更できない場合の解決策:

@ErikZ が彼の投稿に書いたように、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 : 認証チャレンジが見つかりません

于 2014-02-03T17:58:09.263 に答える