具有身份验证的Scala Standalone WS

时间:2015-02-24 08:50:53

标签: scala playframework-2.0

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

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

为什么我的请求持有人的标题是空的?它应该包含(“授权 - >(”承载“+”令牌“))

2 个答案:

答案 0 :(得分:3)

嗯......那是因为Scala语言促进了immutability的想法,因此保持这种精神WsRequestHolder也有点immutable。因此...... withHeaders不会改变当前的WsRequestHolder,但会返回提供标题的新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)

或使用菊花链调用,

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)

答案 1 :(得分:1)

播放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"))

或者如果您要替换所有标题:

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

因此请注意,如果您只想添加标题,请立即添加添加! (与withHeaders相同的行为)