Akka Http DSL 指令,它是如何工作的
Akka Http DSL Directives, how it works
在典型的 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 特征的方法 def。 所以我们输入 '(get ...' 并且 Scala 知道它来自 MethodDirectives,但是如何呢?
对我来说,使这项工作成功的原因似乎是 Scala 编译器的核心功能,这对我来说并不明显。
我总是对从 Java 转向 Scala 的人说,就像皈依一种新的宗教,有时你只需要相信 ;)
我知道当我发现时我会踢自己的:(
好的,取得了一些进展,事实证明,在 Scala 中,您可以导入包、classes、对象、实例、字段和方法等内容。导入方法没什么大不了的,因为函数首先是 class 公民。所以导入
import akka.http.scaladsl.server.Directives._
实际上将导入 Directives 特征中的所有方法(如文档所示):
在上面的问题中,代码使用:
logRequestResult
pathPrefix
get
path
etc ...
这些都是从这个单一导入语句自动导入的所有方法,所以
logRequestResult from DebuggingDirectives
pathPrefix from PathDirectives
get from MethodDirectives
path from PathDirectives
etc ...
如果您克隆此项目 sample app 并单击这些方法,它将带您到定义这些方法的特征,您还会注意到每个特征还有一个伴生对象,这就是使在 Scala 中导入方法成为可能。
对我来说不明显的 Scala 功能是导入方法!
现在我去踢自己:)
在典型的 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 特征的方法 def。 所以我们输入 '(get ...' 并且 Scala 知道它来自 MethodDirectives,但是如何呢?
对我来说,使这项工作成功的原因似乎是 Scala 编译器的核心功能,这对我来说并不明显。
我总是对从 Java 转向 Scala 的人说,就像皈依一种新的宗教,有时你只需要相信 ;)
我知道当我发现时我会踢自己的:(
好的,取得了一些进展,事实证明,在 Scala 中,您可以导入包、classes、对象、实例、字段和方法等内容。导入方法没什么大不了的,因为函数首先是 class 公民。所以导入
import akka.http.scaladsl.server.Directives._
实际上将导入 Directives 特征中的所有方法(如文档所示):
在上面的问题中,代码使用:
logRequestResult
pathPrefix
get
path
etc ...
这些都是从这个单一导入语句自动导入的所有方法,所以
logRequestResult from DebuggingDirectives
pathPrefix from PathDirectives
get from MethodDirectives
path from PathDirectives
etc ...
如果您克隆此项目 sample app 并单击这些方法,它将带您到定义这些方法的特征,您还会注意到每个特征还有一个伴生对象,这就是使在 Scala 中导入方法成为可能。
对我来说不明显的 Scala 功能是导入方法!
现在我去踢自己:)