Retrofit API call: ¿Cómo asegurarse de que el valor no sea nulo después de realizar una llamada de API?

Tengo el siguiente model de authentication de respuesta que utilizo para 3 llamadas de API usando retrofit2. Si realizo la llamada verifyEmail fe, el cuerpo de la respuesta JSON solo contiene un atributo para un correo electrónico válido (algo así como {"validEmail": true}). Las otras 2 llamadas solo contienen attributes para "resetSuccesful" o las otras 4.

¿Cómo puedo asegurarme / verificar que cuando reciba la respuesta a la llamada verifyEmail fe que contenga un valor no nulo para validEmail?

Servicio:

interface AuthenticationService { @POST("auth/checkEmail") fun verifyEmail(@Body email: String): Call<AuthenticationResponse> @POST("auth/login") fun login(@Body loginCnetworkingentials: LoginCnetworkingentials): Call<AuthenticationResponse> @POST("auth/resetPassword") fun resetPassword(@Body email: String): Call<AuthenticationResponse> } 

Modelo:

 data class AuthenticationResponse( val validEmail: Boolean? = null, val loginSuccess: Boolean? = null, val retriesLeft: Int? = null, val authToken: String? = null, val accountBlocked: Boolean? = null, val resetSuccesful: Boolean? = null) 

editar: Si me burlo de mi respuesta del server para devolver fe responseCode = 200 – {"validEmail": null} y cambio validEmail type to Boolean (en lugar de Boolean?) Retrofit no arroja ningún tipo de exception (esto es lo que realmente quiero) ) por lo tanto, mi model me está dando un falso negativo para mi valor válido de correo electrónico.

Definitivamente debería considerar el comentario de @miensol: tener objects de model separados para diferentes llamadas a la API.

Sin embargo, si eso no es posible, puede usar la Sealed class .

 sealed class AuthenticationResponse { data class EmailValidation(val validEmail: Boolean) : AuthenticationResponse() data class SomeSecondResponse(val loginSuccess: Boolean, ...) : AuthenticationResponse() data class SomeThirdResponse(val resetSuccessful: Boolean) : AuthenticationResponse() } fun handleResponse(response: AuthenticationResponse) { when (response) { is AuthenticationResponse.EmailValidation -> response.validEmail is AuthenticationResponse.SomeSecondResponse -> response.loginSuccess is AuthenticationResponse.SomeThirdResponse -> response.resetSuccessful } } 

Sealed class es enumeradas con esteroides, es enumeraciones con estados. Tienes que crear 3 classs para 3 respuestas que henetworkingan de la class sellada AuthenticationResponse .

Debe crear la instancia de class específica correspondiente a las diferentes llamadas de API. Para acceder a los datos, puede hacer una comprobación de tipo y acceder a los datos específicos. El ejemplo anterior muestra cómo acceder a todos los types de respuesta dentro de una function.

¿Cómo puedo asegurarme / verificar que cuando reciba la respuesta a la llamada verifyEmail fe que contenga un valor no nulo para validEmail?

Como usted crea la instancia de solo las classs específicas y todas las classs tienen solo properties que no son nulas, no tiene que preocuparse por null.

Consideraría lo que @miensol mencionó en un comentario, pero si quisiera agregar un cheque para esto, podría hacer algo como:

 fun isEmailValid(authResponse: AuthenticationResponse): Boolean { return authResponse.validEmail ?: false } 

Ver los documentos de Kotlin en Elvis Operator :

Si la expresión a la izquierda de?: No es nula, el operador elvis la devuelve; de ​​lo contrario, devuelve la expresión a la derecha. Tenga en count que la expresión del lado derecho se evalúa solo si el lado izquierdo es nulo.

  • java.lang.NoClassDefFoundError: com.example.api.retrofit.AuthenticationInterceptor $ intercepte $ 1
  • ¿Lee el valor de la anotación de la function de Kotlin usando la reflexión?
  • Obteniendo respuesta HTML / JSON original por error con Retrofit 2 y Kotlin
  • Rx Java Retrofit con flatMap se ejecuta solo una vez
  • Readaptación con kotlin, incapaz de crear @Body
  • Cómo crear el controller de respuesta genérica para el error y validar la respuesta utilizando retrofit, rxjava y dagger
  • Adaptar el cuerpo de la respuesta 2 a la class personalizada
  • Múltiples requestes de modificación2 usando Flowable en Kotlin
  • Android 2 Retrofit llamada sincrónica
  • Retrofit2 Añadir cadena adicional al object Body
  • Retrofit2 y kotlin