§Play WS 迁移指南
Play WS 现在有一个独立版本 - https://github.com/playframework/play-ws - 可在 Play 项目之外使用。如果您有 Play sbt 项目,您仍然可以通过将以下行添加到您的 build.sbt
中来添加 WS
libraryDependencies += ws
这包括 play-ahc-ws
模块,它使用 Play 依赖注入绑定和组件、配置以及其他任何必要的东西来更好地集成独立版本。
如果您想使用缓存支持,您需要添加 ws
、ehcache
以及 启用和配置缓存
libraryDependencies += ws
libraryDependencies += ehcache
如果您想在非 Play 项目中使用它,可以将其添加到 sbt 项目中,方法是
libraryDependencies += "com.typesafe.play" %% "play-ahc-ws-standalone" % "1.0.1"
libraryDependencies += "com.typesafe.play" %% "play-ws-standalone-json" % "1.0.1"
libraryDependencies += "com.typesafe.play" %% "play-ws-standalone-xml" % "1.0.1"
§包变更
Play WS 历史上包含两个库,ws
和 playWs
,分别包含 Scala 和 Java API,每个库都分别在幕后创建 AsyncHTTPClient。现在只有一个 play-ahc-ws
库,它包含 Scala 和 Java WSClient
实例,两者都指向一个单例 AsyncHttpClient
提供程序。
§项目变更
Play WS 现在作为独立 WS 库之上的 Play 特定包装器存在,该库不依赖于 Play 类,并且使用重命名的“阴影”版本的 AsyncHttpClient、Signpost 和 Netty 4.0。
通过提供独立的 WS 版本并使用阴影库,WS 更加灵活,并且与其他库和项目之间的冲突更少。
Play WS API 扩展了 Standalone WS post
,其中包含 Http.Multipart
和 Multipart
类型,这些类型仅在 Play 中可用,例如
def withBody(body: Source[MultipartFormData.Part[Source[ByteString, _]], _]): Self
Signpost OAuth 已更改,因此它不再使用 Commons HTTPClient OAuthProvider,而是使用 DefaultOAuthProvider,后者在幕后使用 HTTPURLConnection。
§API 更改
§Scala
WSAPI
类已移除。WSClient
接口是 WS API 的入口点。
WSRequest
的 withBody[T](body: T)(implicit writable: play.api.http.Writable[T])
方法已被替换,因为它难以追踪 Writable
的行为。现在有一个自定义的 BodyWritable[T]
类型类来实现相同的功能,并且在 Standalone WS 中定义了类型类实例。
override def withBody[T: BodyWritable](body: T)
已弃用的 Scala 单例对象 play.api.libs.ws.WS
已被移除。应改用 WSClient
实例。如果使用编译时依赖注入,则应混合使用 AhcWSComponents
特性。
对于 Guice,系统中有一个可用的 WSClient
。
class MyService @Inject()(ws: WSClient) {
def call(): Unit = {
ws.url("http://localhost:9000/foo").get()
}
}
如果您无法使用注入的 WSClient 实例,则也可以创建您自己的 WSClient 实例,但您需要负责管理客户端的生命周期。
如果您正在运行功能测试,可以使用 play.api.test.WsTestClient
,它将启动并关闭一个独立的 WSClient 实例。
play.api.test.WsTestClient.withClient { ws =>
ws.url("http://localhost:9000/foo").get()
}
ning
包已被 ahc
包替换,Ning* 类也被 AHC* 类替换。
从 stream()
返回的不再是 StreamedResponse
,而是普通的 WSResponse
实例。您应该调用 response.bodyAsSource
来返回流式结果。
play.api.libs.ws.WSRequest
上有一些名称更改和弃用,以使内容在 play.api.libs.ws.WSRequest
上更加明确。迁移这些内容时应格外小心。
- WsRequest.withHeaders
现在是 WsRequest.addHttpHeaders
(相同行为)或 WsRequest.withHttpHeaders
(丢弃现有标头)。
- WsRequest.withQueryString
现在是 WsRequest.addQueryStringParameters
(行为相同)或 WsRequest.withQueryStringParameters
(丢弃现有查询字符串)
§Java
在 Java 中,play.libs.ws.WS
类已弃用。应改用注入的 WSClient
实例。
public class MyService {
private final WSClient ws;
@Inject
public MyService(WSClient ws) {
this.ws = ws;
}
public void call() {
ws.url("http://localhost:9000/foo").get();
}
}
如果您无法使用注入的 WSClient 实例,则也可以创建您自己的 WSClient 实例,但您需要负责管理客户端的生命周期。
如果您正在运行功能测试,可以使用 play.test.WsTestClient
,它将启动并关闭独立的 WSClient
实例
WSClient ws = play.test.WsTestClient.newClient(19001);
...
ws.close();
stream()
返回的不再是 StreamedResponse
,而是普通的 WSResponse
实例。您应该调用 response.getBodyAsSource()
来返回流式结果。
下一步: 缓存迁移
发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区展开讨论。