2015-02-24 43 views
1

我想在没有运行PlayApplication的情况下使用WS客户端。 于是我进口WS的lib只在我build.sbt有:具有身份验证的Scala独立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 
} 

为什么我要求持有人的头部是空的?它应该包含(“授权 - >(”承载“+‘令牌’))

回答

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) 
相关问题