Intereting Posts
Пример пути данных фильтра фильтра Android Как я могу сделать ссылки с помощью HTTML? (Android) Android 2.2: перезагрузите устройство программно Как я могу создавать значки для элементов меню в ListView Android? Добавление диалога прогресса Android в фоновом режиме с помощью AsyncTask, получение исключения FATAL Как проверить доступ в Интернет на Android? InetAddress никогда не истекает Android получает дату до 7 дней (одна неделя) Элемент с фиксированной высотой Android ListView AlertDialog.Builder с настраиваемым макетом и EditText; Не может получить доступ к представлению UnsatisfiedLinkError (собственный метод не найден) Как сжать JSON с gzip в Rails для Android? Как просто обмениваться контентом на стене Facebook с помощью Android SDK? Android «Способ оплаты отклонен» для каждого способа оплаты Как установить Spinner Default по его значению вместо позиции? Как связать Google +, подписанный с пользователями в Parse backend на Android?

Как получить ответ 401 без обработки с помощью try / catch в android

Я использую HttpUrlConnection для создания сетевых запросов от своего приложения для Android. Все работает отлично, за исключением одной вещи, 401. Когда сервер возвращает ответ со статусом 401, мое приложение бросает IOException с сообщением "no authentication challenge found" . После поиска в Google я не нашел ни одного решения, но только обходное решение (обрабатывая его с помощью try / catch, предполагая его ответ 401).

Вот фрагмент кода:

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

Я действительно хочу знать, почему это исключение бросается? Что означает проверка подлинности? Как обеспечить проверку подлинности? Какое изменение я должен внести в свой код для преодоления этой ситуации?

Прошу просветить меня .. 🙂

Solutions Collecting From Web of "Как получить ответ 401 без обработки с помощью try / catch в android"

IOException – довольно общее исключение, и вы не можете спокойно принимать код статуса 401 каждый раз, когда его бросают.

Если в первый раз, когда вы запрашиваете код состояния, он содержит 401, HttpURLConnection будет вызывать исключение IOException. На этом этапе внутренний статус соединения изменится, и теперь он сможет предоставить вам код состояния без каких-либо ошибок.

 int status = 0; try { status = conn.getResponseCode(); } catch (IOException e) { // HttpUrlConnection will throw an IOException if any 4XX // response is sent. If we request the status again, this // time the internal status will be properly set, and we'll be // able to retrieve it. status = conn.getResponseCode(); } if (status == 401) { // ... } 

Для получения дополнительной информации, http://www.tbray.org/ongoing/When/2012/01/17/HttpURLConnection

Попробуйте использовать HttpClient

 private void setCredentials(String login, String password) { if (login != null && password != null) httpClient.getCredentialsProvider().setCredentials( new AuthScope(URL_HOST, 80), new UsernamePasswordCredentials(login, password)); } private InputStream execute(String url, String login, String password) { setCredentials(login, password); HttpGet get = new HttpGet(url); try { HttpResponse response = httpClient.execute(get); int code = response.getStatusLine().getStatusCode(); if (code == HttpURLConnection.HTTP_OK) { InputStream stream = response.getEntity().getContent(); return stream; } else { Log.e("TAG", "Wrong response code " + code + " for request " + get.getRequestLine().toString()); return null; } } catch (IOException e) { e.printStackTrace(); } return null; }