Akka Http客户端:自定义标头

12

我正在尝试使用Akka-Http调用REST URL。 我正在遵循akka文档中示例。 使用此方法,我能够进行rest调用。 但是我无法找到如何添加自定义请求标头。 我尝试使用ModeledCustomHeader,但仍然没有请求头。 这是我的示例。

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

这是我调用的方式,

def invokeHttpRequest(cmd: WSRequestCommand) = {
    val s: HttpRequest = HttpRequest(uri = cmd.url).addHeader(ApiTokenHeader(cmd.apiKey))

    sender ! http.singleRequest(s)
  }

我尝试使用addHeaders()替换addHeader,但是Seq(ApiTokenHeader)不能正常工作,因为它会产生编译错误。

val s: HttpRequest = HttpRequest(uri = cmd.url, headers = Seq(ApiTokenHeader(cmd.apiKey)))

错误:(55,66)类型不匹配;发现: Seq[com.myapp.http.core.ApiTokenHeader],需要: scala.collection.immutable.Seq[akka.http.scaladsl.model.HttpHeader] val s: HttpRequest = HttpRequest(uri = cmd.url, headers = Seq(ApiTokenHeader(cmd.apiKey))) //.addHeader(ApiTokenHeader(cmd.apiKey))

请问有人能帮我为我的请求添加多个自定义头信息吗?我在这里做错了什么?


为了能够使用 Seq,您的标头需要扩展 HttpHeader - Ende Neu
1
你为什么将renderInRequest设置为false? - leachbj
谢谢指出 :) 是我的错误。 - Yadu Krishnan
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jrudolph
2
类型错误是由于不幸的事实,即 scala.Seq != scala.collection.immutable.Seq。因此,您可以使用 ApiTokenHeader(...) :: Nil 创建一个 List(它是 immutable.Seq 的子类型),而不是 Seq(ApiTokenHeader(...)),或者使用 scala.collection.immutable.Seq(ApiTokenHeader(...)) - jrudolph
显示剩余2条评论
2个回答

35

尝试简单地做到这一点,您可以使用带有RawHeaders的HttpMessage方法:

HttpRequest(GET, "/example.com/some")
   .withHeaders(
     RawHeader("X-CSRF-TOKEN", ...))

2

您应该使用不可变的scala.collection.immutable.Seq而不是可变的版本

同时,请不要忘记将renderInRequests和/或renderInResponses设置为true,否则您的标头将消失


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接