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

时间:2017-01-11 14:25:43

标签: scala akka akka-http

我试图在akka X-Request-ID中存储/查找HttpRequest,但HttpHeader似乎没有合适的子类。

是否可以在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的相应案例类。 X-Forward-ForX-Real-Ip也是"Common non-standard request fields"

我找到了related question关于&#34;自定义标题&#34;但我希望不必走那条路......

有使用自定义标头的替代方法吗?

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

1 个答案:

答案 0 :(得分:2)

您可以实施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:ModeledCustomHeaderModeledCustomHeaderCompanion