数据类中的改装响应为空

时间:2019-04-30 09:54:18

标签: kotlin retrofit2

我是Kotlin的新手。我的第一个项目是使用rest api。我已经使用改造来做到这一点。但是我在记录响应时遇到问题,我的数据类为null。我不知道错误在哪里。

我的改装客户

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 个答案:

答案 0 :(得分:1)

您的架构存在问题,您的DataLogin类不同于邮递员架构,Retrofit正在等待:fullName,isActive ....,响应是:header,data ..,您必须创建类包含标头作为Header(errors:List<AnotherClass>)类型的变量,数据作为Data(data(List<DataLogin>),totalRecord:Int)类型的变量,我建议您是否使用JSON to Class之类的帮助网站,在那里解析邮递员的回复,他会给您您正确的响应类,但是它将在java中,您必须自己重写代码,只需在android studio中复制粘贴即可,他将为您将代码转换为Kotlin。 (在网站上,检查源类型:JSON)

答案 1 :(得分:0)

如果不为Gson提供自定义适配器,则必须将json结构与数据类进行匹配。因此,如果您想获得结果,也许类似的事情会起作用:

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方面存在一些问题(关于null安全)。当项目语言为kotlin时,我会使用Moshi并与之配合使用。

请尝试避免在Kotlin中使用!!,因为这会导致RuntimeException。还有其他方法可以检查null并保护您的代码免受RuntimeExceptions的破坏。