具有身份验证的 Scala 独立 WS

Scala Standalone WS with Authentication

我想在没有 运行 PlayApplication 的情况下使用 Play 框架中的 WS 客户端。 所以我只在我的 build.sbt 中导入了 WS 库:

"com.typesafe.play" %% "play-ws" % "2.3.7"

我的示例独立应用程序如下所示:

object WetherWSClient extends App {

  val builder = new AsyncHttpClientConfig.Builder();
  val wsClient = new NingWSClient(builder.build());

  val holder = wsClient.url("http://weather.yahooapis.com/forecastrss?p=80020&u=f")
  holder.withHeaders("Authorization" -> ("Bearer " + "token"))
  println(holder.headers) // prints an empty Map
  val futureResponse = holder.get
  futureResponse.foreach { x => println(x.body) }

  Thread.sleep(500)
  wsClient.close
}

为什么我的请求持有者的 header 是空的?它应该包含 ("Authorization -> ("Bearer " + "token"))

嗯...那是因为 Scala 语言提倡 immutability 的思想,因此保持这种精神 WsRequestHolder 也是一种 immutable。所以... withHeaders 不会改变当前的 WsRequestHolder 而是 returns 提供 headers.

WsRequestHolder 的新实例

这种实施方式的另一个原因是为了方便 daisy-chaining 调用。

所以你必须这样做,

val holder = wsClient.url("http://weather.yahooapis.com/forecastrss?p=80020&u=f")
val newHolder = holder.withHeaders("Authorization" -> ("Bearer " + "token"))
println(newHolder.headers)

或通过 daisy-chaining 个调用,

val holder = wsClient.url("http://weather.yahooapis.com/forecastrss?p=80020&u=f")
  .withHeaders("Authorization" -> ("Bearer " + "token"))
  .withHeaders("OtherAuthorizationHeader" -> ("Well... Daisy! " + "I got chained"))
println(holder.headers)

播放 2.6

withHeaders现已弃用。取 Sarvesh 的答案,现在看起来:

val holder = wsClient.url("http://weather.yahooapis.com/forecastrss?p=80020&u=f")
val newHolder = holder.addHttpHeaders("Authorization" -> (s"Bearer $token"))

或者如果你想替换所有 Headers:

val newHolder = holder.withHttpHeaders("Authorization" -> (s"Bearer $token"))

所以请注意,如果您只想添加 Headers,请立即 添加! (与 withHeaders 相同的行为)