我是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)
我不知道错误在哪里以及为什么我的数据为空。如果响应成功,仍然是空值。
这是一个邮递员的例子
答案 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的破坏。