Scala Akka Http DSL指令及其工作原理
在典型的Akka Http DSL样式中,我们有:Scala Akka Http DSL指令及其工作原理,scala,akka,akka-http,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 { fetchIpInf
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”是如何被识别为MethodDirectivers trait中的方法定义的。所以我们键入“(get…”,Scala知道它来自MethodDirectivers,但如何识别?
对我来说,这似乎是Scala编译器的一个核心特性,而这对我来说并不明显
我总是对那些从Java迁移到Scala的人说,这就像皈依了一种新的宗教,有时你只需要相信;)
当我发现这一点时,我知道我会大发雷霆:(好吧,取得了一些进展,在Scala中,你可以导入包、类、对象、实例、字段和方法。导入方法没什么大不了的,因为函数是一等公民。所以导入
import akka.http.scaladsl.server.Directives._
实际上将导入指令trait中的所有方法(如文档所示):
在上述问题中,代码使用:
logRequestResult
pathPrefix
get
path
etc ...
这些都是从这个import语句自动导入的方法,所以
logRequestResult from DebuggingDirectives
pathPrefix from PathDirectives
get from MethodDirectives
path from PathDirectives
etc ...
如果您克隆这个项目并点击这些方法,它将带您进入定义这些方法的trait,您还将注意到,每个trait还有一个伴随对象,这使得在Scala中导入方法成为可能
对我来说不明显的Scala特性是导入方法
现在我要去踢我自己:)仍然在研究这个问题,似乎在{}中的任何东西,比如在'val routes={…}'中,都是一个局部函数!情节变厚了我有点困惑,为什么这个问题没有被接受,可能是因为它不清楚,或者是一个如此愚蠢的问题,或者其他一些原因。