当前位置: 首页 > 知识库问答 >
问题:

改型API调用:如何确保在进行API调用后值不为null?

颛孙俊
2023-03-14

我有下面的AuthenticationResponse模型,用于使用Reform2的3个api调用。如果我进行verifyEmail调用f.e.,JSON响应主体只包含有效电子邮件的属性(例如{“validEmail”:true})。其他2个调用仅包含“ResetSuccessful”或其他4个调用的属性。

我如何确保/检查收到verifyEmail呼叫f.e.的响应时,它包含validEmail的非空值??

服务:

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?)改装没有引发任何类型的异常(这是我真正想要的),因此我的模型给了我一个validEmail值的假负值。。

共有2个答案

池俊茂
2023-03-14

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

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

请参阅Elvis Operator上的Kotlin文档:

如果?左边的表达式:不为null,elvis运算符将返回它,否则将返回右侧的表达式。请注意,只有当左侧为null时,才会计算右侧表达式。

龚联
2023-03-14

您肯定应该考虑@miensol的注释——为不同的API调用提供单独的模型对象。

但是,如果不可能,可以使用密封类。

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
    }

}

密封的类是类固醇上的枚举——它是带有状态的枚举。您必须为3个响应创建3个类,这些响应继承自密封的类AuthentiationACK

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

我如何确保/检查收到verifyEmail呼叫f.e.的响应时,它包含validEmail的非空值??

由于您只创建特定类的实例,并且所有类都只有非null属性,因此不必担心null。

 类似资料:
  • 我使用postman测试了一个API。使用postman,我设法生成了一个令牌。 从postman那里,我通过一个get请求,使用以下内容和以下详细信息获取了用户的所有数据: 在授权类型下,我选择了“无记名令牌”并将令牌粘贴在其各自的字段中。 当我单击发送时,我得到了一个用户数据的成功响应。 在PHP中,如何在PHP函数中执行相同的api调用(使用id、电子邮件和令牌)? 我试过这个: 但当我查看

  • 问题内容: 好的,这里是twitter API, 任何人都可以给我有关如何使用Meteor调用此API或链接的任何提示吗 更新:: 这是我尝试过的代码,但未显示任何响应 问题答案: 您要定义checkTwitter Meteor.method 内部 客户范围的块。因为您不能从客户端调用跨域(除非使用jsonp),所以您必须将此块放在一个块中。 顺便说一句,每个文档,在客户端的checkTwitte

  • 问题内容: 我正在尝试使用Swift来对REST API进行GET调用,并且试图遵循众多教程,但无法弄清楚。要么是因为我无法弄清楚如何将所有Obj- C转换为Swift,要么是因为不赞成使用n’这样的方法的一半。有谁知道如何进行调用以及解析返回的JSON数据? 问题答案: 您可以这样做: 编辑:对于对此有疑问的人,也许您的JSON流是数组[]而不是对象{},因此您必须将jsonResult更改为

  • 基础连接已关闭:发送时发生意外错误。(身份验证失败,因为远程方已关闭传输流。)

  • 我假设有很多情况需要调用基于值列表的外部RESTful服务。 现在对于这些productId中的每一个,我想并行调用一个外部endpoint。大致如下: 你会如何转换这个 到 当所有通话成功完成时。 一个人如何使用可完成的未来来实现这一点? 我想我要问的是,如何等待所有调用完成,然后以集合的形式获得结果。

  • 我想访问字典中的值,但我无法做响应[“建立”],因为当它被返回时,字典中有一个奇怪的b符号。如何摆脱b符号,以便我可以访问字典? 这是我的代码