Akka HTTP自定义标头:文档中的错误或不熟悉的语法?

时间:2017-12-14 13:15:50

标签: scala akka-http

我正在阅读Akka HTTP文档的this part

在有关自定义标题的小节中,有以下代码段:

final class ApiTokenHeader(token: String) extends ModeledCustomHeader[ApiTokenHeader] {
  override def renderInRequests = false
  override def renderInResponses = false
  override val companion = ApiTokenHeader
  override def value: String = token
}
object ApiTokenHeader extends ModeledCustomHeaderCompanion[ApiTokenHeader] {
  override val name = "apiKey"
  override def parse(value: String) = Try(new ApiTokenHeader(value))
}

val ApiTokenHeader(t1) = ApiTokenHeader("token")
t1 should ===("token")

我认为ApiTokenHeader必须是case class而不是class才能使绑定的值声明有效:val ApiTokenHeader(t1) = ApiTokenHeader("token")

这是正确的还是我错过了一些知识?

1 个答案:

答案 0 :(得分:1)

文档是正确的。示例中ApiTokenHeader的工作原因是因为它扩展了ModeledCustomHeader,其伴随对象扩展了ModeledCustomHeaderCompanionModeledCustomHeaderModeledCustomHeaderCompanion的实现启用了示例中的语法。

来自ModeledCustomHeader的Scaladoc:

  

支持类,用于构建通过实现名称和值定义的用户定义的自定义标头。通过直接实现ModeledCustomHeader而不是CustomHeader,为此类提供了所有必需的unapply方法,以便可以从RawHeader进行模式匹配,反之亦然同样。

来自ModeledCustomHeaderCompanion的Scaladoc:

  

由扩展ModeledCustomHeader的自定义标头的随播广告对象进行扩展。实现必要的applyunapply方法,使这样定义的标题感觉“原生”。

您可以查看hereModeledCustomHeaderSpec(使用ApiTokenHeaderhere的源代码。