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

Akka HTTP custom headers: error in documentation or unfamiliar syntax?

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

在关于自定义 headers 的小节中,有这些代码片段:

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")

这是正确的还是我漏掉了一些知识?

文档是正确的。示例中 ApiTokenHeader 之所以如此工作,是因为它扩展了 ModeledCustomHeader and its companion object extends ModeledCustomHeaderCompanionModeledCustomHeaderModeledCustomHeaderCompanion 的实现启用示例中的语法。

来自 ModeledCustomHeader 的 Scaladoc:

Support class for building user-defined custom headers defined by implementing name and value. By implementing a ModeledCustomHeader instead of CustomHeader directly, all needed unapply methods are provided for this class, such that it can be pattern matched on from RawHeader and the other way around as well.

来自 ModeledCustomHeaderCompanion 的 Scaladoc:

To be extended by companion object of a custom header extending ModeledCustomHeader. Implements necessary apply and unapply methods to make the such defined header feel "native".

您可以查看两者的源代码 here and ModeledCustomHeaderSpec (which uses ApiTokenHeader) here