IOException: "El desafío de autenticación recibido es nulo" (Apache Harmony / Android)

Estoy tratando de enviar un GET a través de HttpURLConnection de Android (que es un org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection), y al recibir la respuesta, se lanza una IOException:

In doRequestInternal (): "El desafío de autenticación recibido es nulo"

¿Qué significa este error y qué está causando esto? Estoy escribiendo los parámetros de OAuth al encabezado de Autorización, pero lo hago en otras ocasiones, también, sin problemas.

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 

Me enteré de la razón.

En primer lugar, a todos los que no son conscientes de lo que este error significa (yo seguro no fue): Esta excepción se lanza si el servidor responde con un 401. Muy intuitivo, teniendo en cuenta que fue lanzado en getResponseCode () Usted nunca puede comprobar para 401s usted mismo, pero tiene que coger este IOException en lugar de otro …).

La causa real para el 401 fue que no envié un código de verificador de OAuth donde se esperaba en este punto.

Tal vez será útil para alguien …

Esta excepción sólo significa encabezados de respuesta mal formados: no se encontró el encabezado "WWW-Authenticate". Además, las respuestas fragmentadas con código 401 no son compatibles, por lo que necesitará el encabezado "Content-Length" (puede ser cero).

Sólo tiene que añadir este encabezado a la solicitud (en el lado del servidor):

 WWW-Authenticate: None 

Tenga en cuenta que hay dos enfoques de autenticación: Autenticación HTTP y autenticación basada en tokens . Si está utilizando la autenticación HTTP, debe seguir la especificación referenciada: incluir el campo de encabezado WWW-Authenticate en el lado del servidor, utilizar java.net.Authenticator localmente, etc. Si está utilizando la autenticación basada en token, obviamente tiene que usar cookies para Almacenar el token y hacer capaz de mantener sesiones vivas vivas. En tal caso poner el siguiente código en android.app.Application.onCreate()

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

Y no tendrá problemas al recibir HTTP 401 desde el servidor sin campo de encabezado WWW-Authenticate .

  • ¿Cómo se determinan los valores de identificador de recursos en Android?
  • Cómo crear un proyecto de biblioteca de android en android?
  • Regex no funciona en Android pero funciona bien en Java
  • Algoritmo de pila de partículas
  • ¿Cómo crear un widget de Android con opciones?
  • Establecer credenciales en una vista Web de Android mediante una conexión HTTPS segura
  • Cambiar el resumen de un ListPreference con el nuevo valor (Android)
  • El depurador de Android oculta una variable local
  • Hacer parte de una cadena audaz en textview
  • Error de descifrado: Bloqueo de pad dañado
  • Se produjo un error al ejecutar doInBackground () android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.