У меня есть контроллер scala, в котором я вызываю внешний веб-сервис, используя WS
api of Play! который возвращает json. Тот же api теперь вызывается с использованием WebSocketClient, поскольку каждое соединение должно быть выполнено с использованием WebSocket вместо http
. Таким образом, нормальный Action
в контроллере преобразуется в функции WebSocket
, однако я не могу назвать функцию WebSocket
из кода scala. Я искал и прошел через несколько мест в Интернете для решения, но я не нашел решения нигде. Как это можно сделать, вызывая функцию WebSocket и извлекая ее json с помощью WebSocketClient в коде scala, или мы можем сказать, потребляя WebSocket
из кода scala? Я нашел похожую на мое questio на SO, но никто не ответил на это! Я хочу знать, возможно ли это в платформе Play?Внедрение WebSocketClient в контроллере Scala
Consume a WebSocket connection using Scala and Play
Edit: Я реализую следующий код:
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)
Переменная result
не печатается на консоли дает исключение JSON парсер.
Update: Мой WebSocket
соединение в ws://0.0.0.0:9000/testSocket
, который находится внутри контроллера Скалигер другого проекта, как в соответствии с:
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: И последнее, что я хотел бы спросить о том, что, мы вызываем WebSocket
подключение с использованием webSocket.sendMessage("test".getBytes())
, которое дает нам ответ WebSocket
по переопределенному методу onMessage()
. Я хочу знать, как мы можем ждать, пока не поступит ответ WebSocket
, чтобы мы могли выполнить требуемые вычисления с данными ответа WebSocket
. Я проверил, возвращая переменную Future[JsValue]
внутри метода onMessage()
, но эта вещь является чем-то недействительным. Итак, как мы можем положить webSocket.sendMessage("test".getBytes())
в ожидании, так что дальнейший код будет выполнен по ответу WebSocket
?
спасибо за ваш ответ , Я прошел через предоставленную вами ссылку github, и я вижу, что реализация кода находится в java. Попробуем реализовать тот же код в scala, когда я работаю с контроллером scala. У вас есть ссылка на ссылку в вашей базе знаний, где эта же реализация предоставляется в scala? –
Я предлагаю вам лучше изучить Скала. Java-код можно тривиально преобразовать в код Scala. –
Я попробовал реализовать код scala из кода Java, предоставленного в вашей указанной ссылке github. Я хочу знать, как, как мне получить выход json, когда WebSocket подключен к scala (при подключении WebSocket подключается, когда мы выполняем 'webSocketVar.sendTextMessage (« test »)?? Я хочу знать, что мне писать внутри переопределенного метод 'onMessage()', чтобы получить json-ответ метода WebSocket, который я подключаю? Я обновил свой вопрос для кода, который я реализую. –