Saya menggunakan Retrofit 2.0.0-beta1 .
Dalam tes saya punya skenario alternatif dan mengharapkan kesalahan HTTP 400
Saya ingin memiliki retrofit.Response<MyError> response
tetapiresponse.body() == null
MyError tidak di-deserialisasi - saya hanya melihatnya di sini
response.errorBody().string()
tetapi itu tidak memberi saya MyError sebagai objek
Jawaban:
Saat ini saya menggunakan implementasi yang sangat mudah, yang tidak perlu menggunakan konverter atau kelas khusus. Kode yang saya gunakan adalah sebagai berikut:
sumber
ErrorResponse adalah objek respons khusus Anda
Kotlin
Jawa
sumber
gson.fromJson(response.errorBody()?.charStream(), type)
Saya menyelesaikannya dengan:
Kelas MyErrorMessage:
sumber
.addConverterFactory(ScalarsConverterFactory.create())
@RonelGonzalesDi Retrofit 2.0 beta2 inilah cara saya mendapatkan respons kesalahan:
Sinkronis
Tidak sinkron
Pembaruan untuk Retrofit 2 beta3:
Asinkron - Parameter retrofit telah dihapus dari onResponse
sumber
List<BasicResponse>
?Dalam https://stackoverflow.com/a/21103420/2914140 dan https://futurestud.io/tutorials/retrofit-2-simple-error-handling varian ini ditampilkan untuk Retrofit 2.1.0.
sumber
Buat model respons Galat & pengguna Gson untuk mengonversi respons terhadapnya. Ini hanya akan berfungsi dengan baik.
APIError.java
MainActivity.java (permintaan di dalam onResponse)
sumber
sumber
Saya melakukannya dengan cara ini untuk panggilan asinkron menggunakan Retrofit 2.0-beta2:
sumber
Jika Anda menggunakan Kotlin solusi lain bisa saja membuat fungsi ekstensi untuk kelas Respons:
Pemakaian
sumber
Ini sebenarnya sangat lurus ke depan.
Kotlin:
Jawa:
Diuji pada retrofit: 2.5.0. Baca teks dari charStream yang akan memberi Anda String, kemudian parse ke JSONObject.
Adios.
sumber
readText()
ekstensi di java, gunakanTextStreamsKt.readText(response.errorBody().charStream())
jika Anda masih di javaSaya menghadapi masalah yang sama. Saya menyelesaikannya dengan retrofit. Biarkan saya tunjukkan ini ...
Jika struktur JSON kesalahan Anda seperti
Dan ini kelas status Kesalahan saya
Sekarang kita membutuhkan kelas yang dapat menangani json kita.
Sekarang kita dapat memeriksa respons kita di retrofit api call
Itu saja sekarang Anda dapat menunjukkan Toast Anda
sumber
Berikut adalah solusi elegan menggunakan
Kotlin
ekstensi:dan penggunaan:
showError(retrofitThrowable.getApiError()?.message)
sumber
Dengan cara ini Anda tidak perlu instance Retrofit jika Anda hanya menyuntikkan layanan yang dibuat dari Retrofit.
Gunakan seperti ini:
sumber
Baca errorBody to a String dan secara manual parse json.
sumber
Ini tampaknya menjadi masalah ketika Anda menggunakan OkHttp bersama dengan Retrofit, jadi Anda dapat menghapus OkHttp atau menggunakan kode di bawah ini untuk mendapatkan badan kesalahan:
sumber
diselesaikan dengan:
sumber
JacksonConverterFactory
keGsonConverterFactory
Ini mengubah json menjadi objek kustom saya tetapi memberikan peringatan cor retrofit.Converter Tidaksumber
Di Kotlin:
sumber
nilai errorBody harus menetapkan objek APIError di Retrofit. Jadi, Anda dapat menggunakan struktur kode di bawah ini.
sumber
Diuji dan bekerja
sumber
sumber