Модернизировать респон нуль в классе данных - PullRequest
0 голосов
/ 30 апреля 2019

Я новичок в отношении Котлина.Мой первый проект - потреблять api отдыха.Я уже сделал это с помощью модернизации.Но у меня есть проблема, когда я регистрирую ответ, мой класс данных является нулевым.Я не знаю, где ошибка.

Мой клиент Rerofit

object RetrofitClient {
    var retrofit: Retrofit? = null

    fun getClient(baseUrl: String): Retrofit? {
        if (retrofit == null) {
            //TODO While release in Google Play Change the Level to NONE
            val interceptor = HttpLoggingInterceptor()
            interceptor.level = HttpLoggingInterceptor.Level.BODY
            val client = OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .connectTimeout(100, TimeUnit.SECONDS)
                .readTimeout(100, TimeUnit.SECONDS)
                .build()

            retrofit = Retrofit.Builder()
                .client(client)
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }

        return retrofit

    }
}

Мой интерфейс

public interface ApiLoginService {

    @POST("UserManagementCoreAPI/api/v1/users")
    fun loginService(@Body request: RequestBody): Call<DataLogin>
}


object ApiUtils {

    val BASE_URL = "------"

    val apiLoginService: ApiLoginService
        get() = RetrofitClient.getClient(BASE_URL)!!.create(ApiLoginService::class.java)

}

Данные моего класса

data class DataLogin (
    @SerializedName("employeeId") val employeeId : String,
    @SerializedName("fullName") val fullName : String,
    @SerializedName("loginConfins") val loginConfins : String,
    @SerializedName("branchId") val branchId : String,
    @SerializedName("isActive") val isActive : String
)

Основная активность

mApiLoginService!!.loginService(requestBody).enqueue(object : Callback<DataLogin>{
                    override fun onResponse(call: Call<DataLogin>, response: Response<DataLogin>) {
                        if(response.isSuccessful()){
                            if(response.body().toString() == null){
                                Log.d(tag,"Null")
                            }else{
                                Log.d(tag,"Logging In  " + response.body()!!)
                                progressBar.visibility = View.GONE
                                btn_submit.visibility = View.VISIBLE
                                startActivity(Intent(this@MainActivity, HomeActivity::class.java))
                            }
                        }else{
                            Toast.makeText(applicationContext, "Invalid username or password", Toast.LENGTH_LONG).show()
                            Log.d(tag,"Error  " + response.errorBody().toString())
                            progressBar.visibility = View.GONE
                            btn_submit.visibility = View.VISIBLE
                        }
                    }
                    override fun onFailure(call: Call<DataLogin>, t: Throwable) {
                        progressBar.visibility = View.GONE
                        btn_submit.visibility = View.VISIBLE
                    }
                })

Мой журнал ответов

message: Logging In  DataLogin(employeeId=null, fullName=null, loginConfins=null, branchId=null, isActive=null)

Я не знаю, где ошибка и почему мои данные равны нулю.Если ответ успешен, он все равно дает мне ноль.

Это пример почтальона enter image description here

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

У вас есть проблема с вашей схемой, ваш класс DataLogin отличается от вашей схемы почтальона, Retrofit ждет: fullName, isActive ...., и ответ: header, data .., вам нужно создать класскоторый содержит заголовок как переменную типа Header(errors:List<AnotherClass>), данные как переменную типа Data(data(List<DataLogin>),totalRecord:Int), я бы посоветовал, если вы используете вспомогательный веб-сайт, такой как JSON для класса , проанализируете ваш ответ почтальона и он даст вамВаш правильный класс ответа, но он будет в Java, вы должны переписать код самостоятельно или просто скопировать вставить в Android Studio, и он преобразует код в Kotlin для вас.(на веб-сайте проверьте тип источника: JSON)

0 голосов
/ 30 апреля 2019

Вы должны сопоставить структуру json с вашими классами данных, если вы не предоставляете специальный адаптер для Gson. Так что если вы хотите получить результат, возможно, что-то вроде этого будет работать:

data class Response(
    @SerializedName("headers") val headers: List<Any>,
    @SerializedName("data") val data: Data
)

data class Data(
    @SerializedName("data") val data: List<DataLogin>,
    @SerializedName("totalRecord") val totalRecord: Int
)

data class DataLogin (
    @SerializedName("employeeId") val employeeId : String,
    @SerializedName("fullName") val fullName : String,
    @SerializedName("loginConfins") val loginConfins : String,
    @SerializedName("branchId") val branchId : String,
    @SerializedName("isActive") val isActive : String
)

Вам необходимо вернуть объект Response из вашего модифицированного вызова.

Также несколько советов о kotlin, Gson хорошо работает для Java, но у него есть некоторые проблемы с kotlin (о нулевой безопасности). Я использую Moshi, когда языком проекта является kotlin, и он хорошо работает с ним.

Старайтесь избегать использования !! в kotlin, потому что это вызовет RuntimeException. Существуют и другие способы проверки нулевого значения и защиты вашего кода от исключений RuntimeExceptions.

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