2017-10-20 43 views
1

Je veux valider le résultat de la fonction complète de mon API, la Réponse génère un NULL quand elle ne peut pas transformer la Chaîne en un type Json, je ne veux pas qu'elle génère de null mais dire: « not found », voici mon itinéraire:Comment valider Complète dans AKKA-HTTP

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)) 
      } 
      } 
     } 
     } 
    } 

cela ne fonctionne pas, car il entre toujours l'autre dans la condition, la réponse JSON quand il obtient la valeur de BD et nulle lorsqu'ils ne sont pas.

Fonction Signe

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) 
    } 
} 
} 

La bibliothèque JSON J'utilise est: Json

aide? Merci.

+0

Ceci est une question très difficile de répondre sans connaître la signature de 'signin'dans et quelle bibliothèque JSON vous utilisez. La valeur 'states' vient aussi de nulle part. Aussi, pourquoi appelez-vous 'signIn' plusieurs fois? – acjay

Répondre

0

Je me suis arrêté pour réfléchir et comment résoudre ce que je devais et d'abord pour confirmer que ce fut une réponse valide était d'analyser la réponse de signIn:

  • Affectez la réponse à un val

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

jeton est de type: Future [Option [TokenEntity]] et je dois travailler avec: Option [TokenEntity] et valider si elle est une réponse correcte:

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

si elle est valide je réponds au format JSON le jeton, mais je réponds avec: Introuvable a finalement été:

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) 
     } 
     } 
    }