改进API调用:如何确保在进行api调用后该值不为空?

我有下面的AuthenticationResponse模型,我使用retrofit2进行3个API调用。 如果我进行了verifyEmail调用,那么JSON响应主体只包含有效的电子邮件属性(如{“validEmail”:true})。 其他2个调用只包含“resetSuccesful”或其他4的属性。

我怎样才能确保/检查,当我收到verifyEmail调用的响应fe,它包含一个非空的validEmail值?

服务:

interface AuthenticationService { @POST("auth/checkEmail") fun verifyEmail(@Body email: String): Call @POST("auth/login") fun login(@Body loginCredentials: LoginCredentials): Call @POST("auth/resetPassword") fun resetPassword(@Body email: String): Call } 

模型:

 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) 

编辑:如果我嘲笑我的服务器响应返回fe responseCode = 200 – {“validEmail”:null}并将validEmailtypes更改为布尔(而不是布尔?)改装不会引发任何种类的exception(这是我真正想要)因此,我的模型给我一个我的validEmail值的假阴性..

你一定要考虑@ miensol的评论 – 为不同的API调用分离模型对象。

但是,如果这是不可能的,你可以使用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是类固醇枚举 – 这是与国家枚举。 您必须为3个响应创建3个类,这些响应从密封的类AuthenticationResponseinheritance。

您必须创建对应于不同API调用的特定类实例。 要访问数据,您可以进行types检查并访问特定的数据。 上面的示例演示如何访问函数内的所有types的响应。

我怎样才能确保/检查,当我收到verifyEmail调用的响应fe,它包含一个非空的validEmail值?

既然你创建了只有特定类的实例,而所有的类只有非空的属性,你不必担心null。

我会考虑在评论中提到@miensol,但是如果你想添加一个这样的检查,你可以这样做:

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

请参阅关于Elvis Operator的 Kotlin文档:

如果?:左边的expression式不为空,则elvis运算符返回它,否则返回右边的expression式。 请注意,右侧的expression式只有在左侧为空时才被评估。