代码之家  ›  专栏  ›  技术社区  ›  Bruno_Ferreira

将Play framework中的WebSocket从2.4版转换为2.6版

  •  2
  • Bruno_Ferreira  · 技术社区  · 8 年前

    def wsWeatherIntervals = WebSocket.using[String] {
      request =>
        val url = "http://api.openweathermap.org/data/2.5/weather?q=Amsterdam,nl"
        val outEnumerator = Enumerator.repeatM[String]({
          Thread.sleep(3000)
          ws.url(url).get().map(r => s"${new java.util.Date()}\n ${r.body}")
        })
        (Iteratee.ignore[String], outEnumerator)
    }
    

    我跟着 this guide 这是我试图使用2.6版运行的代码:

      import play.api.mvc._
      import scala.concurrent.Future
      import akka.stream.scaladsl._
      def wsWeatherIntervals = WebSocket.accept[String, Future[String]] { res =>
        val url = "http://api.openweathermap.org/data/2.5/weather?q=Amsterdam,nl"
        val source = Source.repeat({
          Thread.sleep(3000)
          ws.url(url).get().map(r => s"${new java.util.Date()}\n ${r.body}")
        })
        Flow.fromSinkAndSource(Sink.ignore, source)
      }
    

    但我在运行服务器时遇到了这个错误,它指向该方法的第一行:

    could not find implicit value for parameter transformer: play.api.mvc.WebSocket.MessageFlowTransformer[String,scala.concurrent.Future[String]]
    

    WebSocket.apply 而不是 WebSocket.accept

    1 回复  |  直到 8 年前
        1
  •  2
  •   Mikesname    8 年前

    表面上的错误是,这个游戏不知道如何把一个 Future[String] 到Websocket消息中,通常使用隐式转换器。但是,在这种情况下,您不希望返回 未来[字符串] 无论如何,只是一个可以自动编组的普通字符串(使用提供的 stringMessageFlowTransformer 碰巧如此。)以下是一些应该有效的方法:

    def wsWeatherIntervals = WebSocket.accept[String, String] { res =>
      val url = "http://api.openweathermap.org/data/2.5/weather?q=Amsterdam,nl"
      def f = ws.url(url).get().map(r => s"${new java.util.Date()}\n ${r.body}")
    
      val source = Source.unfoldAsync(f)(last => {
        Thread.sleep(3000)
        f.map(next => Some((last, next)))
      })
      Flow.fromSinkAndSource(Sink.ignore, source)
    }
    

    unfoldAsync source允许我们重复运行一个函数,返回流中下一个元素的未来。(因为我们希望流永远继续,所以返回包装为的值 Some

    这个 Websocket.apply 方法基本上是 accept 这允许您通过返回响应出于某种原因拒绝websocket连接,但如果需要这样做,最好使用 acceptOrResult

    推荐文章