Używam Retrofit 2.0.0-beta1 .
W testach mam alternatywny scenariusz i spodziewam się błędu HTTP 400
Chciałbym mieć retrofit.Response<MyError> response
aleresponse.body() == null
MyError nie jest zdeserializowany - widzę to tylko tutaj
response.errorBody().string()
ale nie daje mi MyError jako obiektu
Odpowiedzi:
Obecnie korzystam z bardzo łatwej implementacji, która nie wymaga stosowania konwerterów ani specjalnych klas. Kod, którego używam, jest następujący:
źródło
ErrorResponse to niestandardowy obiekt odpowiedzi
Kotlin
Jawa
źródło
gson.fromJson(response.errorBody()?.charStream(), type)
Rozwiązałem to przez:
Klasa MyErrorMessage:
źródło
.addConverterFactory(ScalarsConverterFactory.create())
@RonelGonzalesW Retrofit 2.0 beta2 tak otrzymuję odpowiedzi na błędy:
Synchroniczny
Asynchroniczny
Aktualizacja dla Retrofit 2 beta3:
Asynchroniczny - parametr Retrofit został usunięty z onResponse
źródło
List<BasicResponse>
?Na https://stackoverflow.com/a/21103420/2914140 i https://futurestud.io/tutorials/retrofit-2-simple-error-handling ten wariant jest pokazany dla Retrofit 2.1.0.
źródło
źródło
Utwórz model odpowiedzi błędu i użytkownika Gson, aby przekonwertować na niego odpowiedź. To po prostu zadziała.
APIError.java
MainActivity.java (wewnątrz żądania onResponse)
źródło
Zrobiłem to w ten sposób dla wywołań asynchronicznych przy użyciu Retrofit 2.0-beta2:
źródło
Jeśli używasz Kotlina, innym rozwiązaniem może być po prostu utworzenie funkcji rozszerzenia dla klasy Response:
Stosowanie
źródło
W rzeczywistości jest to bardzo proste.
Kotlin:
Jawa:
Testowane przy modernizacji: 2.5.0. Przeczytaj tekst z charStream, który da ci String, a następnie przeanalizuj do JSONObject.
Adios.
źródło
readText()
rozszerzenia w java, użyj,TextStreamsKt.readText(response.errorBody().charStream())
jeśli nadal jesteś w javaMiałem ten sam problem. Rozwiązałem to za pomocą modernizacji. Pokażę to ...
Jeśli twoja błędna struktura JSON jest podobna do
A to moja klasa statusu błędu
Teraz potrzebujemy klasy, która poradzi sobie z naszym jsonem.
Teraz możemy sprawdzić naszą odpowiedź w wywołaniu api modernizacji
To wszystko, teraz możesz pokazać swój Toast
źródło
Oto eleganckie rozwiązanie wykorzystujące
Kotlin
rozszerzenia:i zastosowanie:
showError(retrofitThrowable.getApiError()?.message)
źródło
W ten sposób nie potrzebujesz instancji Retrofit, jeśli wstrzykujesz tylko usługę utworzoną za pomocą Retrofit.
Użyj tego w ten sposób:
źródło
Wydaje się, że jest to problem, gdy używasz OkHttp wraz z Retrofit, więc możesz usunąć OkHttp lub użyć poniższego kodu, aby uzyskać treść błędu:
źródło
Przeczytaj errorBody do String i ręcznie przeanalizuj json.
źródło
rozwiązał to przez:
źródło
JacksonConverterFactory
naGsonConverterFactory
To konwertuje json na mój niestandardowy obiekt, ale daje ostrzeżenie Unchecked Cast retrofit.źródło
W Kotlinie:
źródło
Wartości errorBody powinny ustawiać obiekt APIError w Retrofit. Możesz więc użyć poniższej struktury kodu.
źródło
Przetestowane i działa
źródło
źródło