retrofit2: ПОЛУЧИТЕ МЕТОД реагирования на ошибки - PullRequest
0 голосов
/ 06 марта 2020

У меня возникла проблема с получением данных из API. Я получил ответ об ошибке с телом, содержит null, когда я проверяю с Log, и я получил сообщение, подобное этому.

E/allCustomer: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $

это результат API в POSTMAN введите описание изображения здесь
это мой код для модели данных

data class BaseResponseList (
    @SerializedName("status")
    @Expose
    var status: Boolean,
    @SerializedName("data")
    @Expose
    var data: Array<Customer>
)

это мой код для класса Customer

ata class Customer (
    @SerializedName("id_pelanggan")
    @Expose
    var idPelanggan: String,
    @SerializedName("nama_pelanggan")
    @Expose
    var namaPelanggan: String,
    @SerializedName("alamat")
    @Expose
    var  alamat: String,
    @SerializedName("tarif")
    @Expose
    var  tarif: String,
    @SerializedName("daya")
    @Expose
    var  daya: String,
    @SerializedName("tgl_wo")
    @Expose
    var  tglWo: String,
    @SerializedName("ulp")
    @Expose
    var  ulp: String,
    @SerializedName("bln_thn_bongkar")
    @Expose
    var  blnThnBongkar: String,
    @SerializedName("merk_lama")
    @Expose
    var  merkLama: String,
    @SerializedName("no_lama")
    @Expose
    var  noLama: String,
    @SerializedName("type_lama")
    @Expose
    var  typeLama: String,
    @SerializedName("arus_lama")
    @Expose
    var  arusLama: String,
    @SerializedName("bln_thn_pasang")
    @Expose
    var  blnThnPasang: String,
    @SerializedName("merk_baru")
    @Expose
    var  merkBaru: String,
    @SerializedName("no_baru")
    @Expose
    var  noBaru: String,
    @SerializedName("type_baru")
    @Expose
    var  typeBaru: String,
    @SerializedName("arus_baru")
    @Expose
    var  arusBaru: String,
    @SerializedName("kode_ket")
    @Expose
    var  kodeKet: String,
    @SerializedName("foto")
    @Expose
    var  foto: String,
    @SerializedName("ttk_koordinat_x")
    @Expose
    var  ttkKoordinatX: String,
    @SerializedName("ttk_koordinat_y")
    @Expose
    var  ttkKoordinatY: String,
    @SerializedName("id_user")
    @Expose
    var idUser: String?,
    @SerializedName("id_region")
    @Expose
    var  idRegion: String
)

это мой код для настройки дооснащения2

object Api {
    private val BASE_URL: String = BuildConfig.API_SRAPP
    private var gson = GsonBuilder().setLenient().create()
    private val httpClient = OkHttpClient.Builder()

    fun <T>service(java: Class<T>): T{
        httpClient.addInterceptor(StethoInterceptor())
        val retrofit = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(BASE_URL)
            .client(httpClient.build())
            .build()
        return retrofit.create(java)
    }
}

interface CustomerServices {
    @GET("customer")
    fun getAllCustomer(@Header("Authorization") auth: String): Call<BaseResponseList>
}

this мой код для реализации Retrofit2 для получения данных от API

class CustomerPresenter {
    private val apiCustomer = Api.service(CustomerServices::class.java)

    fun loadAllCustomer(){
        val token = OfflineHelper.getToken().orEmpty()
        apiCustomer.getAllCustomer(token)
            .enqueue(object : Callback<BaseResponseList>{
                override fun onFailure(call: Call<BaseResponseList>, t: Throwable) {
                    Log.e("allCustomer", "${t.message}")
                    Log.e("callRequest", "${call.request().method()}")
                    Log.e("execute", "${call.isExecuted}")
                    Log.e("body", "${call.request().body()?.contentType()}")
Log.e("stackstrace", "${t.stackTrace}, ${t.printStackTrace()}")
                }

                override fun onResponse(
                    call: Call<BaseResponseList>,
                    response: Response<BaseResponseList>
                ) {
                    Log.w("loadedAll", "${response.body()}")
                }
            })

    }
}

, и это все результат из журнала

E/allCustomer: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $
E/callRequest: GET
E/execute: true
E/body: null
W/System.err: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:121)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:206)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
W/System.err: Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
        ... 9 more
E/stackstrace: [Ljava.lang.StackTraceElement;@2b067c2, kotlin.Unit

1 Ответ

0 голосов
/ 07 марта 2020

Попробуйте использовать другой объект модификации здания ConvertorFactory. Я предлагаю вам ScalarsConverterFactory: val retrofit = Retrofit.Builder() .addConverterFactory(ScalarsConverterFactory.create()) .baseUrl(BASE_URL) .client(httpClient.build()) .build()

Это позволит вам вернуть JSON ответ в виде примитивных типов (в вашем примере тип String)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...