akka-http - 如何链接作为函数结果的路由(使用 `~` )?

标签 akka-http spray-routing

scala> import akka.http.scaladsl.server._; import Directives._
import akka.http.scaladsl.server._
import Directives._

假设我有两个函数,从某种类型(例如Int)到Route:

scala> lazy val r1: Int => Route = ???
r1: Int => akka.http.scaladsl.server.Route = <lazy>

scala> lazy val r2: Int => Route = ???
r2: Int => akka.http.scaladsl.server.Route = <lazy>

我可以这样组成一条路线:

scala> lazy val composite: Route = path("foo"){ r1(1) } ~ path("bar"){ r2(1) }
composite: akka.http.scaladsl.server.Route = <lazy>

我想做的是将函数组合与 ~ 路径链接一起使用。也就是说,我希望它能正常工作:

scala> lazy val composite: Int => Route = path("foo")(r1) ~ path("bar")(r2)

除了它没有:-(

<console>:31: error: type mismatch;
 found   : Int => akka.http.scaladsl.server.Route
    (which expands to)  Int => (akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult])
 required: akka.http.scaladsl.server.Route
    (which expands to)  akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult]
       lazy val composite: Int => Route = path("foo")(r1) ~ path("bar")(r2)
                                                      ^

编辑

我正在尝试使用无点函数组合来做到这一点。正如下面 Ramon 的回答所示,如果您愿意复制函数应用程序,则很容易做到这一点(但这是我想要避免的)。即:

lazy val composite: Int => Route 
  = i => path("foo")(r1(i)) ~ path("bar")(r2(i))

注意

使用 scalaz,我可以这样做:

scala> import akka.http.scaladsl.server._; import Directives._; import scalaz.syntax.monad._; import scalaz.std.function._
import akka.http.scaladsl.server._
import Directives._
import scalaz.syntax.monad._
import scalaz.std.function._

scala> lazy val r1: Int => Route = ???
r1: Int => akka.http.scaladsl.server.Route = <lazy>

scala> lazy val r2: Int => Route = ???
r2: Int => akka.http.scaladsl.server.Route = <lazy>

scala> lazy val composite = for (x <- r1; y <- r2) yield path("foo")(x) ~ path("bar")(y)
composite: Int => akka.http.scaladsl.server.Route = <lazy>

这很好,但是 akka.http.scaladsl.server 中的隐式 ConjunctionMagnet.fromRouteGenerator 让我有理由认为它可能在 akka-直接http

最佳答案

与您给出的 scalaz 示例等效的是:

lazy val composite: Int => Route = 
  (i) => path("foo")(r1(i)) ~ path("bar")(r2(i))

同样,您可以匿名化参数名称,但这会产生 2 个参数:

lazy val composite: (Int,Int) => Route = path("foo")(r1(_)) ~ path("bar")(r2(_))

关于akka-http - 如何链接作为函数结果的路由(使用 `~` )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45209440/

相关文章:

scala - Akka-http logrequest 不记录请求正文

java - 使用响应解码器的 Akka HTTP

tomcat - Spray-Servlet 加载时出现死信

java - 如何在喷雾路由中将Java对象转换为Json

java - 在 actor 之间发送 Akka HttpEntity

java - 如何在 Akka 2.4.7 中将 Scala HTTP 路由转换为 Java HTTP 路由?

scala - Spray - 反序列化可选查询参数

scala - 喷洒 Akka Json 解码

scala - Akka http客户端连接池的正确使用