akka HttpHeader 可以存储 X-Request-ID 或 X-Correlation-ID 字段吗?

Can akka HttpHeader store an X-Request-ID or X-Correlation-ID Field?

我正在尝试 store/lookup X-Request-ID in an akka HttpRequest but HttpHeader 似乎没有合适的子class。

是否可以访问 HttpHeader 中的 X-Request-ID 字段或 X-Correlation-ID 字段?

根据documentation,以下代码获取授权令牌:

import akka.http.scaladsl.model.headers._

case class User(name: String, pass: String)

// a method that extracts basic HTTP credentials from a request
def credentialsOfRequest(req: HttpRequest): Option[User] =
  for {
    Authorization(BasicHttpCredentials(user, pass)) <- req.header[Authorization]
  } yield User(user, pass)

但是 headers 包没有 X-Request-ID 的对应案例 class。有 X-Forward-ForX-Real-Ip 也有 "Common non-standard request fields".

我发现 关于 "custom headers" 但我希望不必走那条路...

是否有使用自定义 headers 的替代方法?

提前感谢您的考虑和回复。

您可以实现一个Custom Header以获得您想要的功能,如下所示:

def requestIdOfRequest(req: HttpRequest): Option[String] =
  for {
    `X-Request-Id`(id) <- req.header[`X-Request-Id`]
  } yield id

final class `X-Request-Id`(id: String) extends ModeledCustomHeader[`X-Request-Id`] {
  override def renderInRequests = false
  override def renderInResponses = false
  override val companion = `X-Request-Id`
  override def value: String = id
}

object `X-Request-Id` extends ModeledCustomHeaderCompanion[`X-Request-Id`] {
  override val name = "X-Request-Id"
  override def parse(value: String) = Try(new `X-Request-Id`(value))
}

Scaladoc:ModeledCustomHeader, ModeledCustomHeaderCompanion