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 ModeledCustomHeaderCompanion
。 ModeledCustomHeader
和 ModeledCustomHeaderCompanion
的实现启用示例中的语法。
来自 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。
我正在阅读 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 ModeledCustomHeaderCompanion
。 ModeledCustomHeader
和 ModeledCustomHeaderCompanion
的实现启用示例中的语法。
来自 ModeledCustomHeader
的 Scaladoc:
Support class for building user-defined custom headers defined by implementing name and value. By implementing a
ModeledCustomHeader
instead ofCustomHeader
directly, all neededunapply
methods are provided for this class, such that it can be pattern matched on fromRawHeader
and the other way around as well.
来自 ModeledCustomHeaderCompanion
的 Scaladoc:
To be extended by companion object of a custom header extending
ModeledCustomHeader
. Implements necessaryapply
andunapply
methods to make the such defined header feel "native".
您可以查看两者的源代码 here and ModeledCustomHeaderSpec
(which uses ApiTokenHeader
) here。