如何在 AKKA-HTTP 中验证 Complete

How to validate Complete in AKKA-HTTP

我想验证我的 API 的完整功能的结果,响应在无法将字符串转换为 Json 类型时生成空值,我不希望它这样做生成 null 但说:"not found",这是我的路线:

 val route = pathPrefix("auth") {
    path("signIn") {
      pathEndOrSingleSlash {
        post {
          entity(as[LoginPassword]) { loginPassword =>
            val a = signIn(loginPassword.login, loginPassword.password).map(_.asJson)
             if(signIn(loginPassword.login, loginPassword.password).map(_.asJson) == null){
               complete(states.map(_.asJson))
             }else {
               def getObject : Option[Any] = Option(signIn(loginPassword.login, loginPassword.password).map(_.asJson))
               val ahh = signIn(loginPassword.login, loginPassword.password).map(_.asJson)
               if(getObject.isEmpty || getObject == null){ ///////NOT FOUND
                 complete("Not Found")
               }else {
                 complete(signIn(loginPassword.login, loginPassword.password).map(_.asJson)
               }
               //complete(signIn(loginPassword.login, loginPassword.password).map(_.asJson))
             }
          }
        }
      }
    } 

这行不通,因为它总是在条件中输入else,当它得到BD中的值时响应Json,否则返回null。

函数符号

 def signIn(login: String, password: String): Future[Option[TokenEntity]]   = {

db.run(users.filter(u => u.username === login).result).flatMap { users =>
  users.find(user => Bcrypt.validate(password, user.password)) match {
    case Some(user) => db.run(tokens.filter(_.userId === user.id).result.headOption).flatMap {
      case Some(token) => Future.successful(Some(token))
      case None        => createToken(user).map(token => Some(token))
    }
    case None  => Future.successful(None)
  }
}
}

我使用的Json库是:Json

有帮助吗?谢谢

我停下来思考问题以及如何解决我需要的问题,首先要验证它是一个有效的响应是分析 signIn 的响应:

  • 将响应分配给一个值

    val token = signIn(loginPassword.login, loginPassword.password)
    

token 的类型是:Future[Option[TokenEntity]],我需要使用:Option[TokenEntity] 并验证它是否是正确的答案:

       val response = token.map(_ match {
        case Some(token) => prepareHttpResponse(StatusCodes.OK, token.asJson.toString)
        case None => prepareHttpResponse(StatusCodes.Unauthorized, "{reason: \"not found\"")
      })

如果有效,我会以 Json 格式回复令牌,但我会回复:未找到 最后是:

 val route = pathPrefix("auth") {
    path("signIn") {
      post {
        entity(as[LoginPassword]) { loginPassword =>
          val token = signIn(loginPassword.login, loginPassword.password)
          val response = token.map(_ match {
            case Some(token) => prepareHttpResponse(StatusCodes.OK, token.asJson.toString)
            case None => prepareHttpResponse(StatusCodes.Unauthorized, "{reason: \"not found\"")
          })
          complete(response)
        }
      }
    }