Estoy usando HttpUrlConnection
para realizar solicitudes de red desde mi aplicación de Android. Todo funciona bien, excepto una cosa, 401. Cuando el servidor devuelve la respuesta con el código de estado 401, mi aplicación arroja IOException
con un mensaje que indica, "no authentication challenge found"
. Después de buscar en Google, no he encontrado una sola solución, sino solo una solución alternativa (manejarla usando try/catch, suponiendo que es una respuesta 401).Cómo obtener la respuesta 401 sin manejarlo usando try/catch en android
aquí es el fragmento de código:
public Bundle request(String action, Bundle params, String cookie) throws FileNotFoundException, MalformedURLException, SocketTimeoutException,
IOException {
OutputStream os;
String url = baseUrl + action;
Log.d(TAG, url);
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setConnectTimeout(30 * 1000);
conn.setReadTimeout(30 * 1000);
conn.setRequestProperty("User-Agent", System.getProperties().getProperty("http.agent") + "AndroidNative");
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setDoOutput(true);
conn.setDoInput(true);
if (cookie != null) {
conn.setRequestProperty("Cookie", cookie);
}
if (params != null) {
os = conn.getOutputStream();
os.write(("--" + boundary + endLine).getBytes());
os.write((encodePostBody(params, boundary)).getBytes());
os.write((endLine + "--" + boundary + endLine).getBytes());
uploadFile(params, os);
os.flush();
os.close();
}
conn.connect();
Bundle response = new Bundle();
try {
response.putInt("response_code", conn.getResponseCode());
Log.d(TAG, conn.getResponseCode() + "");
response.putString("json_response", read(conn.getInputStream()));
List<String> responseCookie = conn.getHeaderFields().get("set-cookie");
// Log.d(TAG, responseCookie.get(responseCookie.size() - 1));
response.putString("cookie", responseCookie.get(responseCookie.size() - 1));
} catch (SocketTimeoutException e) {
throw new SocketTimeoutException(e.getLocalizedMessage());
} catch (FileNotFoundException e) {
throw new FileNotFoundException(e.getLocalizedMessage());
} catch (IOException e) {
e.printStackTrace();
response.putInt("response_code", HttpURLConnection.HTTP_UNAUTHORIZED);
response.putString("json_response", read(conn.getErrorStream()));
}
// debug
Map<String, List<String>> map = conn.getHeaderFields();
for (String key : map.keySet()) {
List<String> values = map.get(key);
for (String value : values) {
Log.d(key, value);
}
}
conn.disconnect();
return response;
}
Realmente quiero saber, ¿por qué esta excepción se lanza? ¿Qué significa desafío de autenticación? ¿Cómo proporcionar desafío de autenticación? ¿Qué cambio debo hacer en mi código para superar esta situación?
favor ilumíneme .. :)
supongo que significa que el servidor responde con un código de error 401, pero omite la cabecera 'WWW-Authenticate' que describe el desafío de autenticación. El servidor – Jens
tiene el encabezado 'WWW-Authenticate', pero aún recibo este error. – jtanveer
Me acabo de topar con esto, y tampoco puedo encontrar la manera de recuperar este código de respuesta sin tener que asumir que es un 401 después de atrapar la IOException (ya que 'getResponseCode()' arrojará la misma IOException que 'connect()/getInputStream()/getOutputStream() '). Desde stacktrace, parece que 'org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processAuthHeader (HttpURLConnectionImpl.java:1153) 'es responsable de arrojar la excepción por la cadena (aunque no pude bucear más). –