Я новичок в Котлине. Мой первый проект - использовать API для отдыха. Я уже сделал это, используя модификацию. Но у меня проблема, когда я регистрирую ответ, мой класс данных равен нулю. Я не знаю, где ошибка.
Мой клиент по ремонту
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)
Я не знаю, где ошибка и почему мои данные пусты. Если ответ будет успешным, он все равно даст мне null.
Это пример почтальона






У вас есть проблема с вашей схемой, ваш класс DataLogin отличается от вашей схемы почтальона, модернизация ожидает: fullName, isActive...., и ответ: заголовок, данные.., вам нужно создать класс, содержащий заголовок как переменная типа Header(errors:List<AnotherClass>), данные как переменная типа Data(data(List<DataLogin>),totalRecord:Int), я бы посоветовал, если вы используете вспомогательный веб-сайт, такой как JSON в класс, проанализируйте там свой ответ почтальона, и он даст вам правильный класс ответа, но он будет в java, вам нужно переписать код самостоятельно просто скопируйте и вставьте в Android Studio, и он преобразует код в Kotlin для вас. (на веб-сайте проверьте Тип источника: JSON)
Сначала это должно быть из вашего API, вы помещаете объекты в массив данных, а затем помещаете этот массив данных в другой объект данных, вам нужно изменить внешнее поле данных на массив, а затем помещать объекты непосредственно внутрь него (объект: employeeId, fullname ,...)
Это выводится, когда im Log.d Data = DataLogin(data=Data(data=[DataX(branchId=999, employeeId=david999, fullName=MUHAMMAD DAVID, isActive=true, loginConfins=david999)], totalRecord=1), header =Заголовок(ошибки=[])). Как показать только эти данные DataX(branchId=999, employeeId=david999, fullName=MUHAMMAD DAVID, isActive=true, loginConfins=david999)?
Вы должны сопоставить структуру 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.
Большое спасибо, это работает. Но у меня есть другой вопрос. Как отображать только данные (List<DataLogin>?