我正在阅读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")
这是正确的还是我错过了一些知识?
答案 0 :(得分:1)
文档是正确的。示例中ApiTokenHeader
的工作原因是因为它扩展了ModeledCustomHeader
,其伴随对象扩展了ModeledCustomHeaderCompanion
。 ModeledCustomHeader
和ModeledCustomHeaderCompanion
的实现启用了示例中的语法。
来自ModeledCustomHeader
的Scaladoc:
支持类,用于构建通过实现名称和值定义的用户定义的自定义标头。通过直接实现
ModeledCustomHeader
而不是CustomHeader
,为此类提供了所有必需的unapply
方法,以便可以从RawHeader
进行模式匹配,反之亦然同样。
来自ModeledCustomHeaderCompanion
的Scaladoc:
由扩展
ModeledCustomHeader
的自定义标头的随播广告对象进行扩展。实现必要的apply
和unapply
方法,使这样定义的标题感觉“原生”。
您可以查看here和ModeledCustomHeaderSpec
(使用ApiTokenHeader
)here的源代码。