【问题标题】:Akka Http DSL Directives, how it worksAkka Http DSL 指令,它是如何工作的
【发布时间】:2018-11-06 14:55:21
【问题描述】:

在典型的 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 的人说,就像皈依一个新的宗教,有时你只需要相信 ;)

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

【问题讨论】:

  • 仍在调查这个问题,似乎 {} 中的任何内容都像 'val routes = {...}' 中的部分函数!情节变厚
  • 我有点不明白为什么这个问题没人回答,可能是因为不清楚,或者这是一个愚蠢的问题或其他原因。

标签: scala akka akka-http


【解决方案1】:

好吧,取得了一些进展,事实证明,在 Scala 中,您可以导入包、类、对象、实例、字段和方法等内容。导入方法没什么大不了的,因为函数是一等公民。所以导入

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

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

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

logRequestResult
pathPrefix
get
path
etc ...

这些都是从这个单一的导入语句自动导入的方法,所以

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

如果您克隆此项目sample app 并单击这些方法,它将带您到定义这些特征的特征,您还会注意到每个特征还有一个伴随对象,这就是导入方法的原因Scala 可能。

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

现在我要去踢自己了:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2021-10-29
    • 2021-12-29
    • 2018-10-10
    相关资源
    最近更新 更多