具有身份验证的 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
相同的行为)
我想在没有 运行 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
相同的行为)