J'utilise Retrofit 2.0.0-beta1 .
Dans les tests, j'ai un scénario alternatif et je m'attends à une erreur HTTP 400
J'aimerais avoir retrofit.Response<MyError> response
maisresponse.body() == null
MyError n'est pas désérialisé - je ne le vois qu'ici
response.errorBody().string()
mais cela ne me donne pas MyError comme objet
Réponses:
J'utilise actuellement une implémentation très simple, qui ne nécessite pas l'utilisation de convertisseurs ou de classes spéciales. Le code que j'utilise est le suivant:
la source
ErrorResponse est votre objet de réponse personnalisé
Kotlin
Java
la source
gson.fromJson(response.errorBody()?.charStream(), type)
Je l'ai résolu par:
Classe MyErrorMessage:
la source
.addConverterFactory(ScalarsConverterFactory.create())
@RonelGonzalesDans Retrofit 2.0 beta2, voici comment j'obtiens des réponses d'erreur:
Synchrone
Asynchrone
Mise à jour pour Retrofit 2 beta3:
Asynchrone - Le paramètre Retrofit a été supprimé de onResponse
la source
List<BasicResponse>
?Dans https://stackoverflow.com/a/21103420/2914140 et https://futurestud.io/tutorials/retrofit-2-simple-error-handling, cette variante est présentée pour Retrofit 2.1.0.
la source
Créez un modèle de la réponse d'erreur et de l'utilisateur Gson pour y convertir la réponse. Cela fonctionnera très bien.
APIError.java
MainActivity.java (requête interne onResponse)
la source
la source
Je l'ai fait de cette façon pour les appels asynchrones en utilisant Retrofit 2.0-beta2:
la source
Si vous utilisez Kotlin, une autre solution pourrait être simplement de créer une fonction d'extension pour la classe Response:
Usage
la source
C'est en fait très simple.
Kotlin:
Java:
Testé lors de la modernisation: 2.5.0. Lisez le texte du charStream qui vous donnera une chaîne, puis analysez JSONObject.
Adios.
la source
readText()
extension sur java, utilisezTextStreamsKt.readText(response.errorBody().charStream())
si vous êtes toujours sur javaJ'étais confronté au même problème. Je l'ai résolu avec la modernisation. Laisse-moi te montrer ça ...
Si votre structure JSON d'erreur est comme
Et c'est ma classe de statut d'erreur
Maintenant, nous avons besoin d'une classe qui peut gérer notre json.
Nous pouvons maintenant vérifier notre réponse dans l'appel de l'API de mise à niveau
Ca y est maintenant tu peux montrer ton toast
la source
Voici une solution élégante utilisant des
Kotlin
extensions:et utilisation:
showError(retrofitThrowable.getApiError()?.message)
la source
De cette façon, vous n'avez pas besoin d'une instance Retrofit si vous injectez uniquement un service créé à partir de Retrofit.
Utilisez-le comme ceci:
la source
Lisez errorBody dans une chaîne et analysez manuellement json.
la source
Cela semble être le problème lorsque vous utilisez OkHttp avec Retrofit, vous pouvez donc supprimer OkHttp ou utiliser le code ci-dessous pour obtenir le corps de l'erreur:
la source
résolu par:
la source
JacksonConverterFactory
pourGsonConverterFactory
Il convertit json en mon objet personnalisé mais il donne un avertissement Rénovation de fonte non vérifiée Convertisseur <capture <? >>la source
À Kotlin:
la source
Les valeurs errorBody doivent définir l'objet APIError dans Retrofit. Pour cela, vous pouvez utiliser la structure de code ci-dessous.
la source
Testé et fonctionne
la source
la source