我想在没有运行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
}
为什么我的请求持有人的标题是空的?它应该包含(“授权 - >(”承载“+”令牌“))
答案 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
相同的行为)