HttpURLConnection funktionierte gut in Android 2.x, aber NICHT in 4.1: Keine Authentifizierungsherausforderungen gefunden

Lesezeit: 5 Minuten

HttpURLConnection funktionierte gut in Android 2x aber NICHT in 41
Feuerbär

Ich habe einige typische Codes, die HttpURLConnection verwendet haben, um eine Datei mit einer URL zu erhalten. Sie funktionierten gut in Android 1.x und 2.x. Aber bei Android 4.1 fehlgeschlagen!

Ich habe im Internet gesucht, aber wenig ähnliche Informationen gefunden. Würde jemand bitte helfen, dieses Problem zu untersuchen?

private String mURLStr; 
private HttpURLConnection mHttpConnection;

...

url = new URL(mURLStr);

...

mHttpConnection = (HttpURLConnection) url.openConnection();
mHttpConnection.setDoOutput(true);
mHttpConnection.setRequestMethod("GET");

...

InputStream is = mHttpConnection.getInputStream();

Die getInputStream-Methode löst eine Ausnahme aus:

08-01 15:56:48.856: W/System.err(13613): java.io.IOException: No authentication challenges found
08-01 15:56:48.856: W/System.err(13613):      at libcore.net.http.HttpURLConnectionImpl.getAuthorizationCredentials(HttpURLConnectionImpl.java:427)
08-01 15:56:48.866: W/System.err(13613):      at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:407)
08-01 15:56:48.866: W/System.err(13613):      at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:356)
08-01 15:56:48.866: W/System.err(13613):      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
08-01 15:56:48.866: W/System.err(13613):      at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
...

  • Es funktionierte, nachdem ich die Zeile „mHttpConnection.setDoOutput(true)“ entfernt hatte! Es schien, dass dieses Problem den gleichen Grund hat wie Millionen andere: Android 4.x verwandelt http GET in POST, wenn setDoOutput(true)! Zu Ihrer Information: http://webdiary.com/tag/java-net-httpurlconnection/

    – Feuerbär

    4. August 2012 um 17:54 Uhr


  • Ich habe das gleiche Problem, aber ich benutze es nicht setDoOutput(). Unter Android 4.0 funktioniert alles einwandfrei Eiscreme-Sandwich (ICS)ist aber auf Android 4.1 defekt Jelly Bean (JB). Übrigens, das setDoOutput() verwandelt eine Anfrage in eine POST Anfrage macht absolut Sinn, da a BEKOMMEN Die Anforderung sollte keine Nutzlast im Körper haben.

    – Zimt

    9. August 2012 um 16:08 Uhr

Ich stehe aktuell vor dem gleichen Problem. Auf 4.1 Jelly Bean erhalte ich eine IOException „Keine Authentifizierungsherausforderungen gefunden“, wenn ich getResponseCode() auf der HttpURLConnection aufrufe.

Ich habe online gesucht, um zu sehen, was sich im Android-Quellcode geändert hat, und Folgendes gefunden: 4.0.4 (funktioniert): https://bitbucket.org/seandroid/libcore/src/7ecbe081ec95/luni/src/main/java/libcore/net/http/HttpURLConnectionImpl.java
4.1.1 (funktioniert nicht): https://bitbucket.org/seandroid/libcore/src/6b27266a2856/luni/src/main/java/libcore/net/http/HttpURLConnectionImpl.java

Wie man in 4.1 JB sehen kann, wirft die Methode getAuthorizationCredentials() die IOException. Es analysiert die Challenge-Header, die es in der Antwort findet, mit HeaderParser.parseChallenges(..), wenn der Antwortcode 401 oder 407 ist. Wenn die zurückgegebene Liste leer ist, wird die Ausnahme ausgelöst.

https://bitbucket.org/seandroid/libcore/src/6b27266a2856/luni/src/main/java/libcore/net/http/HeaderParser.java

Wir untersuchen derzeit, was genau dazu führt, dass diese Liste leer ist, haben aber den Verdacht, dass unser Server realm=… anstelle von realm=”…” im Challenge-Header verwendet. Fehlende Anführungszeichen könnten die Ursache für dieses Problem sein. Wir müssen weiter untersuchen, ob das tatsächlich der Fall ist und ob wir es zum Laufen bringen können.

  • +1 Für eine klare Erklärung und die Links zum Code. Der Code erwartet auch, dass realm=” der erste Parameter nach dem Schema ist.

    – J_D

    11. Oktober 2012 um 14:47 Uhr

  • Inzwischen konnten wir verifizieren, dass die Verwendung von realm= ohne Anführungszeichen tatsächlich der Grund war, der diesen Fehler bei uns verursacht hat. Wir konnten dies auf unserer Backend-Seite ändern und jetzt funktioniert alles wie erwartet.

    – Hendrik

    16. Oktober 2012 um 13:05 Uhr

  • Ich habe meine App endlich unter Android 4.x zum Laufen gebracht, indem ich sie einfach entfernt habe mHttpConnection.setDoOutput(true);。Aber ich hatte die eigentliche Ursache immer noch nicht genau gewusst.

    – Feuerbär

    5. November 2012 um 7:06 Uhr

  • +1 für ausgezeichnete Antwort. Das Problem auf meiner Seite war die Serverrückgabe von realm=… anstelle von realm=”…” . Das wurde behoben und die App begann sowohl mit ICS als auch mit JB zu arbeiten

    – SysHex

    23. Oktober 2013 um 14:46 Uhr

  • hast du dafür einen Workaround gefunden? Es funktioniert auf Kitkat, aber nicht auf JB

    – Schwarzer Gürtel

    6. März 2014 um 18:08 Uhr

Pro RFC2617:

Die Antwortnachricht 401 (Nicht autorisiert) wird von einem Ursprungsserver verwendet, um die Autorisierung eines Benutzeragenten anzufechten. Diese Antwort MUSS ein WWW-Authenticate-Header-Feld enthalten, das mindestens eine Abfrage enthält, die auf die angeforderte Ressource anwendbar ist.

Bei Android ist die HttpURLConnection getResponseCode() Methode wirft java.io.IOException: No authentication challenges found wenn der Server entweder a 401 Unauthorized oder 407 Proxy Authentication Required Statuscode ohne gesetzten WWW-Authenticate-Header.

Wenn Sie die serverseitige API besitzen, können Sie sie beheben, indem Sie den erforderlichen WWW-Authenticate-Header hinzufügen, wenn Sie 401 oder 407 zurückgeben. In meinem Fall habe ich sie in PHP wie folgt behoben:

header('WWW-Authenticate: OAuth realm="users"');
header('HTTP/1.1 401 Unauthorized');

Ich habe das gleiche Problem. Ich habe diese Problemumgehung gefunden, aber sie funktioniert nicht auf Android 2. Auf Jelly Bean funktioniert sie gut. Verwenden Sie einfach getErrorStream() anstelle von getInputStream().

try
{
    responseStream = new BufferedInputStream(connection.getInputStream());
}
catch(IOException e)
{
    responseStream = new BufferedInputStream(connection.getErrorStream());
}

HttpURLConnection funktionierte gut in Android 2x aber NICHT in 41
Amit

Üerschrift

Ich habe das Problem für die Jelly Bean behoben. Bitte verwenden Sie den folgenden Code für das obige Szenario

DefaultHttpClient client = new DefaultHttpClient();
client.getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials(userName,userPass));
HttpGet request = new HttpGet();
request.addHeader("Accept", "application/xml");
request.setURI(new URI(service));
HttpResponse response = client.execute(request);

Sie haben die richtige Antwort erhalten, wie Sie sie brauchten.

1645704188 319 HttpURLConnection funktionierte gut in Android 2x aber NICHT in 41
James

Ich bin auf ein ähnliches Problem mit einem Webdienst gestoßen, der Cookies benötigte, um korrekt zu funktionieren. Anscheinend erstellt Jelly Bean standardmäßig nicht automatisch einen Cookie-Speicher (im Gegensatz zu früheren Versionen), sodass der Dienst meine Sitzung nicht finden konnte und jedes Mal, wenn ich versuchte, darauf zuzugreifen, einen 401 auslöste. Durch Hinzufügen der folgenden Codezeilen zu meiner Anwendungsinitialisierung wurde das Problem behoben:

// enable VM-wide cookie support for HttpUrlConnection
// see http://developer.android.com/reference/java/net/HttpURLConnection.html for details
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);

1645704188 647 HttpURLConnection funktionierte gut in Android 2x aber NICHT in 41
Gemeinschaft

Wenn Sie die Standardauthentifizierung verwenden und setDoOutput(true) nicht aufrufen, hatten wir immer noch dieses Problem:

Hier ist die Lösung:

HTTP-Basisauthentifizierungsproblem auf Android Jelly Bean 4.1 mit HttpURLConnection

1645704189 73 HttpURLConnection funktionierte gut in Android 2x aber NICHT in 41
Matthäus Blackford

Überprüfen Sie, ob Ihr Server eine zurückgibt Error 401 - Not Authorised. Ich glaube, der Android-Code sieht diese Antwort und glaubt, dass er dazu gedacht war, Authentifizierungsdetails bereitzustellen. In meinem Fall habe ich meinem Server nur das falsche Token bereitgestellt.

842920cookie-checkHttpURLConnection funktionierte gut in Android 2.x, aber NICHT in 4.1: Keine Authentifizierungsherausforderungen gefunden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy