Estou usando o Retrofit 2.0.0-beta1 .
Nos testes, tenho um cenário alternativo e espero o erro HTTP 400
Eu gostaria de ter retrofit.Response<MyError> response
masresponse.body() == null
MyError não é desserializado - só o vejo aqui
response.errorBody().string()
mas não me dá MyError como objeto
Respostas:
Atualmente, uso uma implementação muito fácil, que não requer o uso de conversores ou classes especiais. O código que eu uso é o seguinte:
fonte
ErrorResponse é seu objeto de resposta personalizado
Kotlin
Java
fonte
gson.fromJson(response.errorBody()?.charStream(), type)
Eu resolvi isso por:
Classe MyErrorMessage:
fonte
.addConverterFactory(ScalarsConverterFactory.create())
@RonelGonzalesNo Retrofit 2.0 beta2, é desta maneira que estou recebendo respostas de erro:
Síncrono
Assíncrono
Atualização para o Retrofit 2 beta3:
Assíncrono - O parâmetro Retrofit foi removido do onResponse
fonte
List<BasicResponse>
?Em https://stackoverflow.com/a/21103420/2914140 e https://futurestud.io/tutorials/retrofit-2-simple-error-handling, essa variante é mostrada no Retrofit 2.1.0.
fonte
fonte
Crie um modelo da resposta a erros e do usuário Gson para converter a resposta. Isso vai funcionar bem.
APIError.java
MainActivity.java (dentro da solicitação onResponse)
fonte
Fiz dessa maneira para chamadas assíncronas usando o Retrofit 2.0-beta2:
fonte
Se você usar o Kotlin, outra solução pode ser apenas criar a função de extensão para a classe Response:
Uso
fonte
Na verdade, é muito direto.
Kotlin:
Java:
Testado em retrofit: 2.5.0. Leia o texto do charStream que fornecerá uma String e analise JSONObject.
Adios.
fonte
readText()
extensão em java, useTextStreamsKt.readText(response.errorBody().charStream())
se você ainda estiver em javaEu estava enfrentando o mesmo problema. Eu o resolvi com o retrofit. Deixe-me mostrar isso ...
Se sua estrutura JSON de erro for como
E essa é minha classe de status de erro
Agora precisamos de uma classe que possa lidar com nosso json.
Agora, podemos verificar nossa resposta em retrofit call api
É isso agora, você pode mostrar seu brinde
fonte
Aqui está uma solução elegante usando
Kotlin
extensões:e uso:
showError(retrofitThrowable.getApiError()?.message)
fonte
Dessa forma, você não precisa de uma instância de Retrofit se estiver injetando apenas um serviço criado a partir de Retrofit.
Use-o assim:
fonte
Esse parece ser o problema quando você usa o OkHttp junto com o Retrofit, para remover o OkHttp ou usar o código abaixo para obter o corpo do erro:
fonte
Leia errorBody em uma String e analise manualmente json.
fonte
resolvido por:
fonte
JacksonConverterFactory
aGsonConverterFactory
Ele converte json no meu objeto personalizado mas dá aviso retrofit.Converter elenco Desmarcado <captura <>>?fonte
Em Kotlin:
fonte
Os valores errorBody devem definir o objeto APIError no Retrofit. Para que você possa usar a estrutura de código abaixo.
fonte
Testado e funciona
fonte
fonte