改进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个类,这些响应从密封的类AuthenticationResponse
inheritance。
您必须创建对应于不同API调用的特定类实例。 要访问数据,您可以进行types检查并访问特定的数据。 上面的示例演示如何访问函数内的所有types的响应。
我怎样才能确保/检查,当我收到verifyEmail调用的响应fe,它包含一个非空的validEmail值?
既然你创建了只有特定类的实例,而所有的类只有非空的属性,你不必担心null。
我会考虑在评论中提到@miensol,但是如果你想添加一个这样的检查,你可以这样做:
fun isEmailValid(authResponse: AuthenticationResponse): Boolean { return authResponse.validEmail ?: false }
请参阅关于Elvis Operator的 Kotlin文档:
如果?:左边的expression式不为空,则elvis运算符返回它,否则返回右边的expression式。 请注意,右侧的expression式只有在左侧为空时才被评估。
- 迭代时从列表中移除IndexOutOfBoundsException:Java-> Kotlin
- 如何在Kotlin中创建一个也是Java中不可变列表的不可变列表?
- 如何创建像anko – DSL语法Kotlin嵌套函数回调
- 为什么json字符串为空时,我将一个内部对象传递给Gson()。toJson(object)in Kotlin?
- Corda:error = org.hibernate.InstantiationException:没有实体的默认构造函数
- AssertionError:根包必须被初始化
- 如何指定一个类型参数我不知道
- Travis CI:Maven未能获得Kotlin 1.1.1对Linux的依赖
- Kotlin:UnsupportedOperationException用于get / set操作符