Ошибка подключения дооснащения RetrofitError.response как null

Использование Retrofit 1.6.0, OkHTTP 2.0.0 и OkHTTP-UrlConnection 2.0.0.

Я делаю POST для службы с помощью Retrofit до URL, который не существует. Вызывается обратный вызов отказа, как и ожидалось. Однако параметр RetrofitError не имеет ответа. Мне бы очень хотелось получить код статуса HTTP, который был возвращен с помощью

error.getResponse().getStatus() 

Но поскольку getResponse () возвращает null, я не могу.

Почему getResponse () null и как я могу получить статус?

Благодарю.

Кроме того, ошибка, которую я получаю, является UnknownHostException, как и ожидалось. Повторите: я ожидаю эту ошибку. Я хочу знать, как получить код статуса HTTP или почему error.getResponse () возвращает значение null.

Изменить: Вот код:

 RestAdapterBuilderClass.java RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("http://badURL.DoesntMatter/"); .setRequestInterceptor(sRequestInterceptor) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); sService = restAdapter.create(ServiceInterface.class); ServiceInterface.java @POST("/Login") void login(@Body JsonObject body, Callback<String> callback); CallbackClass.java @Override public void failure(RetrofitError error) { if (error.getResponse() == null) { // error.getResponse() is null when I need to get the status code // from it. return; } } 

Когда вы получаете исключение UnknownHostException, это означает, что вы не смогли установить соединение с сервером. Фактически вы не можете ожидать статуса HTTP в этом случае.

Естественно, вы можете получить ответ Http (и с этим статусом), когда вы можете подключиться к серверу.

Даже когда вы получаете код статуса 404, вы установили соединение с сервером. Это не то же самое, что и UnknownHostException.

Функция getResponse () может возвращать значение null, если вы не получили ответа.

RetrofitError имеет метод, называемый isNetworkError() который вы можете использовать для обнаружения неудавшегося запроса из-за сетевых проблем. Обычно я добавляю небольшой вспомогательный метод:

 public int getStatusCode(RetrofitError error) { if (error.isNetworkError()) { return 503; // Use another code if you'd prefer } return error.getResponse().getStatus(); } 

А затем использовать этот результат для обработки любой дополнительной логики сбоя (выход из системы 401, отображение сообщения об ошибке на 500 и т. Д.).

Я использую Retrofit 2. Когда endpoint url заканчивается на «/», как в вашем случае, и снова в вашем интерфейсе он начинается с «/» [@POST («/ Login»)] вызывает эту проблему. Удалите «/» из метода .setEndpoint ()

Просто чтобы расширить ответ на @ lyio, я нашел из журнала Fabric, что getKind () иногда возвращает UNEXPECTED, а затем, если вы разбираете сообщение, вы получаете тайм-ауты и проблемы с подключением, поэтому я написал класс утилиты ниже.

 public class NetworkUtils { // Compiled from Fabric events private static final List<String> networkErrorStrings = new ArrayList<>(Arrays.asList( "Unable to resolve host", "Connection closed by peer", "Failed to connect", "timeout", "Connection timed out")); public static boolean isNetworkError(@Nullable RetrofitError retrofitError) { if (retrofitError != null) { if (retrofitError.getKind() != RetrofitError.Kind.NETWORK) { for (String error : networkErrorStrings) { if (retrofitError.getMessage().contains(error)) { return true; } } } else { return true; } } return false; } - public class NetworkUtils { // Compiled from Fabric events private static final List<String> networkErrorStrings = new ArrayList<>(Arrays.asList( "Unable to resolve host", "Connection closed by peer", "Failed to connect", "timeout", "Connection timed out")); public static boolean isNetworkError(@Nullable RetrofitError retrofitError) { if (retrofitError != null) { if (retrofitError.getKind() != RetrofitError.Kind.NETWORK) { for (String error : networkErrorStrings) { if (retrofitError.getMessage().contains(error)) { return true; } } } else { return true; } } return false; } 

}

Intereting Posts
Как реализовать CordovaInterface, чтобы я мог использовать камеру в веб-просмотре? Где файл сохраняется, когда используется openFileOutput? RecyclerView не прокручивается на дно OutOfMemoryError при декодировании и кодировании Base64 String в Bitmap Чтение событий клавиатуры в Android WebView Неразрешенная ссылка для кинжала 2 в Котлине Как нарисовать пунктирную полилинию с android google map sdk v2? Как запустить команду в качестве фонового процесса с использованием АБР? Java.util.zip.GZIPInputStream.readFully при загрузке файла в android Приложение не удается развернуть на эмулятор Android Intel по API 19 (платформа 4.4.2) Исходный код для Android Android: изображение с 9 патчами не растягивается, как ожидалось Как добавить дополнительный параметр тестового прогона в тестовые тесты Android Studio 2.3 Android CAB уничтожает после просмотра списка уведомленийdatasetchanged Как я могу отключить весь эффект прокрутки в моем приложении?