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

时间:2017-08-23 14:34:40

标签: kotlin retrofit retrofit2 notnull

我有使用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值..

2 个答案:

答案 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运算符返回它,否则返回右边的表达式。请注意,仅当左侧为空时才评估右侧表达式。