在典型的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的人们就像在转变为一种新的宗教,有时您只需要相信;)
我知道当我发现自己会踢自己:(
答案 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功能是导入方法!
现在我要踢自己:)