Не удается получить данные из API с помощью retrofit2 - PullRequest
0 голосов
/ 05 марта 2020

помогите мне в этом вопросе, пожалуйста, я хочу получить данные от API

{
"status": true,
"data": [
    {
        "id_pelanggan": "456",
        "nama_pelanggan": "ahmad",
        "alamat": "taliwang"
    },
    {
        "id_pelanggan": "457",
        "nama_pelanggan": "ahmad",
        "alamat": "taliwang"
    }
]}

это мой объект API для настройки для динамического c класса, retrofit2 и gson

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{
        val retrofit = Retrofit.Builder()
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(BASE_URL)
            .client(httpClient.build())
            .build()
        return retrofit.create(java)
    }
}

это мой класс BaseRespon для обработки всех данных из API и с Dynami c класс

data class BaseResponse<T>(
    val status: Boolean,
    val data: T?
)

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

data class Customer (
    @SerializedName("id_pelanggan")
    @Expose
    val idPelanggan: String,
    @SerializedName("nama_pelanggan")
    @Expose
    val namaPelanggan: String,
    @SerializedName("alamat")
    @Expose
    val alamat: String
)

это мой сервис API

interface CustomerServices {

    @GET("customer")
    fun getAllCustomer(@Header("Authorization") auth: String): Call<BaseResponse<ArrayList<Customer>>>

    @GET("customer")
    fun getCustomerbyID(@Header("Authorization") auth: String, @Query("id") id: String): Call<BaseResponse<Customer>>

}

и это мой класс по использованию API

class CustomerPresenter {

    fun loadAllCustomer(){
        apiCustomer.getAllCustomer(OfflineHelper.getToken())
            .enqueue(object : Callback<BaseResponse<ArrayList<Customer>>>{
                override fun onFailure(call: Call<BaseResponse<ArrayList<Customer>>>, t: Throwable) {
                    Log.e("allCustomer", "${t.message}")
                }

                override fun onResponse(
                    call: Call<BaseResponse<ArrayList<Customer>>>,
                    response: Response<BaseResponse<ArrayList<Customer>>>
                ) {
                    saveLocalCustomer(response.body())
                }
            })
    }

    fun saveLocalCustomer(data: BaseResponse<ArrayList<Customer>>?){
        Log.w("loadedAll", "${data?.status}")
    }

и у меня сбой журнала в loadAllCustomer

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

Я не понимаю, почему это сбой, мой конечная точка не опечатка, и я проверил ее на почтальоне

Ответы [ 3 ]

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

Обновите ваш класс ответа и интерфейс API, как показано ниже

data class BaseResponse(
    val status: Boolean,
    val data: List<Customer>?
)

 interface CustomerServices {

    @GET("customer")
    fun getAllCustomer(@Header("Authorization") auth: String): Call<BaseResponse>

    @GET("customer")
    fun getCustomerbyID(@Header("Authorization") auth: String, @Query("id") id: String): Call<Customer>

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

ваша модель не совпадает с вашим объектом json

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

Вам необходимо использовать List в качестве типа возврата для поля данных. попробуйте это:

data class BaseResponseList<T>(
    val status: Boolean,
    val data: List<T>?
)

и затем используйте BaseResponseList в своем вызове следующим образом:

@GET("customer") 
fun getAllCustomer(@Header("Authorization") auth: String): Call<BaseResponseList<Customer>>

Используйте BaseResponseList для любой конечной точки, которая возвращает List и BaseResponse для объектов

...