Jak uzyskać odpowiedź 401 bez obsługi za pomocą try / catch na Androidzie

ja używamHttpUrlConnection tworzyć żądania sieciowe z mojej aplikacji na Androida. Wszystko działa dobrze z wyjątkiem jednej rzeczy, 401. Gdy serwer zwraca odpowiedź z kodem stanu 401, moja aplikacja rzucaIOException z komunikatem informującym,"no authentication challenge found". Po przeszukaniu go nie znalazłem ani jednego rozwiązania, ale tylko obejście (obsługa go za pomocą try / catch, zakładając jego odpowiedź 401).

Oto fragment kodu:

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

Naprawdę chcę wiedzieć, dlaczego ten wyjątek został rzucony? Co oznacza wyzwanie uwierzytelniania? Jak zapewnić wyzwanie uwierzytelniania? jakie zmiany muszę wprowadzić w swoim kodzie, aby przezwyciężyć tę sytuację?

Proszę, oświeć mnie.. :)

questionAnswers(2)

yourAnswerToTheQuestion