【问题标题】:Adding headers to an Akka HTTP HttpRequest向 Akka HTTP HttpRequest 添加标头
【发布时间】:2019-10-28 00:43:48
【问题描述】:

我有一个现有的 Akka HTTP HttpRequest,我想向它添加两个标头。

val req: HttpRequest = ???
val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b"))
req.addHeaders(hs)

预期:

  • 带有附加标头的新 HttpRequest 对象

实际:

  • .addHeaders 需要 java.lang.Iterable 并且不会编译。

在 Scala 中推荐的执行方式是什么?

有一个解决方法,但有点笨拙:

req.withHeaders(req.headers ++ hs)

运行 Scala 2.12.8 和 Akka HTTP 10.1.7。

【问题讨论】:

    标签: scala akka-http


    【解决方案1】:

    另一种解决方法可能是一个不那么笨重的小条子。这大概是addHeadersdefined in the source 的样子。不幸的是,我不知道为什么 addHeaders 没有暴露在 scala api 中。

    req.mapHeaders(_ ++ hs)
    

    【讨论】:

    • 整洁并感谢您提供的源链接 - 我很少检查它们。真正的答案似乎是在 Scala API 上实现 .addHeaders 但我目前并没有真正使用 Akka HTTP,所以不会是这样做的人。
    【解决方案2】:

    另一种方法是使用foldLeftaddHeader

    val req: HttpRequest = ???
    val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b"))
    
    hs.foldLeft(req)((r, h) => r.addHeader(h))
    

    【讨论】:

    • 它仍然不是很可读。我想知道为什么 '.addheaders' 是用于 Java API 而不是 Scala 的原因。
    【解决方案3】:

    您可以将现有的 HttpRequest 复制到带有标头的新 HttpRequest

    val req: HttpRequest = ???
    val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b"))
    val reqWithHeaders: HttpRequest = req.copy(headers=hs)
    

    【讨论】:

    • 这是追加还是替换早期的标题?
    • 这将替换早期的标题。如果您想要更早的标题也将其更改为 val reqWithHeaders: HttpRequest = req.copy(headers = this.headers ++ hs)
    • ..这与我的问题中的解决方法没有太大区别。无论如何,没有一个答案提到为什么 Akka HTTP 只支持 Java API 的一种语法 (.addHeaders)。这本来就是问题所在。
    • 我不确定,但我认为 Scala HttpHeader extends jm.HttpHeader(akka.http.javadsl.model, Java Model) 和addHeaders, withHeaders 是 jm.HttpHeaders 的方法,所以要覆盖它们的方法签名必须与 Jm.HttpHeaders 方法相同。因此 Scala HttpHeaders 将 java Iterable 用于它的一些方法。同样,答案是我对源代码的理解。请随时纠正我。
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多