J'ai un contrôleur de scala dans lequel j'appelle un service web externe en utilisant WS
api de Play! cadre qui renvoie un json. La même API doit maintenant être appelée à l'aide d'un WebSocketClient, car toute connexion doit être effectuée à l'aide d'un WebSocket au lieu de http
. Donc Action
normal dans le contrôleur sont convertis en WebSocket
fonctions, mais je ne suis pas en mesure d'appeler une fonction WebSocket
à partir du code scala. J'ai cherché et ai traversé plusieurs endroits sur le Web pour la solution, mais je n'ai pas trouvé la solution n'importe où. Comment cela peut-il être fait, en appelant une fonction WebSocket et récupérer son json en utilisant un WebSocketClient dans le code scala OU nous pouvons dire, en consommant un WebSocket
à partir du code scala? J'ai trouvé une question similaire à la mienne sur SO mais aucune n'a donné de réponse à ça! Je veux savoir si c'est possible ou pas dans le cadre de jeu?Implémentation d'un WebSocketClient dans le contrôleur Scala
Consume a WebSocket connection using Scala and Play
Edit: Je suis le code suivant la mise en œuvre:
val c = new AsyncHttpClient()
val webSocketClient = c.prepareGet("ws://0.0.0.0:9000/testSocket").execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(new WebSocketTextListener {
override def onMessage(s: String): Unit = {
}
override def onOpen(webSocket: websocket.WebSocket): Unit = {
webSocket.sendTextMessage("test")
}
override def onFragment(s: String, b: Boolean): Unit = {}
override def onError(throwable: Throwable): Unit = {}
override def onClose(webSocket: websocket.WebSocket): Unit = {
latch.countDown()
}
}).build()).get()
val result = webSocketClient.sendTextMessage("true")
println("================================" + result)
La variable result
n'est pas imprimé sur la console donnant une exception de l'analyseur de JSON.
Mise à jour: Ma connexion WebSocket
à ws://0.0.0.0:9000/testSocket
qui est à l'intérieur d'un contrôleur de scala de projet différent, est aussi sous:
def sockeTest = WebSocket.tryAccept[JsValue] { request =>
futureJsonVariable.map { json =>
val in = Iteratee.ignore[JsValue]
// Some database computation here which generated a Future[JsValue] value in futureJsonVariable variable.
val out = Enumerator(json).andThen(Enumerator.eof)
Right((in, out))
} recover {
case err => Left(InternalServerError(err.getMessage))
}
}
Update2: Une dernière chose que je voudrais demander au sujet de ce que, nous invoquons une WebSocket
connexion en utilisant webSocket.sendMessage("test".getBytes())
qui nous donne la réponse de WebSocket
dans la méthode substituée onMessage()
. Je veux savoir, comment pouvons-nous attendre jusqu'à ce qu'une réponse WebSocket
est reçue, de sorte que nous puissions effectuer les calculs requis avec les données de réponse WebSocket
. J'ai vérifié en retournant une variable Future[JsValue]
à l'intérieur de la méthode onMessage()
mais cette chose est quelque chose d'invalide. Alors, comment pouvons-nous mettre webSocket.sendMessage("test".getBytes())
en mode attente, de sorte que le code supplémentaire est exécuté sur la réponse de WebSocket
?
Merci pour votre réponse , Je suis passé par le lien github fourni par vous et je peux voir que l'implémentation du code est en Java. J'essaierai d'implémenter le même code dans scala que je travaille avec le contrôleur de scala. Avez-vous des références de liens dans votre base de connaissances où cette même implémentation est fournie dans scala? –
Je vous suggère d'apprendre Scala mieux. Le code Java peut être trivialement converti en code Scala. –
J'ai essayé d'implémenter le code scala à partir du code java fourni sur votre dit lien github. Je veux savoir comment, comment puis-je récupérer la sortie json quand un WebSocket est connecté à partir de scala (Un WebSocket est connecté lorsque nous effectuons 'webSocketVar.sendTextMessage (" test ")'? Je veux savoir ce que je devrais écrire dans le overridden méthode 'onMessage()' afin d'obtenir la réponse json de la méthode WebSocket que je connecte? J'ai mis à jour dans ma question pour le code que j'applique –