我有使用retrofit2进行3次api调用的AuthenticationResponse模型。如果我调用verEmail调用f.e. JSON响应主体仅包含有效电子邮件的属性(所以类似{“validEmail”:true})。其他2个调用仅包含“resetSuccesful”或其他4个的属性。
当我收到对verifyEmail调用f.e的响应时,如何确认/检查?它包含validEmail的非null值
服务:
interface AuthenticationService {
@POST("auth/checkEmail")
fun verifyEmail(@Body email: String): Call<AuthenticationResponse>
@POST("auth/login")
fun login(@Body loginCredentials: LoginCredentials): Call<AuthenticationResponse>
@POST("auth/resetPassword")
fun resetPassword(@Body email: String): Call<AuthenticationResponse>
}
型号:
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)
编辑: 如果我模拟我的服务器响应返回f.e. responseCode = 200 - {“validEmail”:null}并将validEmail类型更改为Boolean(而不是Boolean?)Retrofit不会抛出任何类型的异常(这是我真正想要的)因此我的模型给了我一个假的否定我的validEmail值..
答案 0 :(得分:1)
你绝对应该考虑@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个类,这些类继承自密封的类AuthenticationResponse
。
您必须创建与不同API调用相对应的特定类实例。要访问数据,您可以键入检查并访问特定数据。上面的when
示例显示了如何访问函数内的所有响应类型。
如何在收到回复时确认/检查 verifyEmail调用f.e.它包含非null值 validEmail ??
由于您只创建了特定类的实例,并且所有类只有非null属性,因此您不必担心null。
答案 1 :(得分:0)
我会考虑@miensol在评论中提到的内容,但是如果你想为此添加一个检查,你可以这样做:
fun isEmailValid(authResponse: AuthenticationResponse): Boolean {
return authResponse.validEmail ?: false
}
请参阅Elvis Operator上的Kotlin文档:
如果?:左边的表达式不为null,则elvis运算符返回它,否则返回右边的表达式。请注意,仅当左侧为空时才评估右侧表达式。