Akka Http DSL指令,如何工作

时间:2018-11-06 14:55:21

标签: scala akka akka-http

在典型的Akka Http DSL风格中,我们有:

import akka.http.scaladsl.server.Directives._

然后在代码中您可能会看到类似

的内容
val routes = {
logRequestResult("akka-http-microservice") {
  pathPrefix("ip") {
    (get & path(Segment)) { ip =>
      complete {
        fetchIpInfo(ip).map[ToResponseMarshallable] {
          case Right(ipInfo) => ipInfo
          case Left(errorMessage) => BadRequest -> errorMessage
        }
      }
    } ~
    (post & entity(as[IpPairSummaryRequest])) { ipPairSummaryRequest =>
      complete {
        val ip1InfoFuture = fetchIpInfo(ipPairSummaryRequest.ip1)
        val ip2InfoFuture = fetchIpInfo(ipPairSummaryRequest.ip2)
        ip1InfoFuture.zip(ip2InfoFuture).map[ToResponseMarshallable] {
          case (Right(info1), Right(info2)) => IpPairSummary(info1, info2)
          case (Left(errorMessage), _) => BadRequest -> errorMessage
          case (_, Left(errorMessage)) => BadRequest -> errorMessage
        }
      }
    }
  }
}

我没有完全了解的是例如如何将(get & path(Segment)) { ip =>中的'get'识别为MethodDirectives特性的方法定义。 所以我们键入'(get ...',Scala知道它来自MethodDirectives,但是如何?

在我看来,使这项工作有效的原因是Scala编译器的核心功能,这对我而言并不明显。

我总是说,从Java迁移到Scala的人们就像在转变为一种新的宗教,有时您只需要相信;)

我知道当我发现自己会踢自己:(

1 个答案:

答案 0 :(得分:2)

好吧,取得了一些进展,事实证明,在Scala中,您可以导入诸如包,类,对象,实例,字段和方法之类的东西。导入方法没什么大不了的,因为功能是一等公民。因此,导入

import akka.http.scaladsl.server.Directives._

实际上将导入Directives特性中的所有方法(如文档所示):

在上述问题中,代码使用:

logRequestResult
pathPrefix
get
path
etc ...

这些都是从此单个import语句自动导入的所有方法,因此

logRequestResult from DebuggingDirectives
pathPrefix from PathDirectives
get from MethodDirectives
path from PathDirectives
etc ...

如果克隆此项目sample app并单击以下方法,它将带您到定义了这些特征的特征,您还将注意到,每个特征还具有一个伴随对象,这使得导入Scala中可能的方法。

对我来说不明显的Scala功能是导入方法

现在我要踢自己:)