文档

§Play WS 迁移指南

Play WS 现在有一个独立版本 - https://github.com/playframework/play-ws - 可在 Play 项目之外使用。如果您有 Play sbt 项目,您仍然可以通过将以下行添加到您的 build.sbt 中来添加 WS

libraryDependencies += ws

这包括 play-ahc-ws 模块,它使用 Play 依赖注入绑定和组件、配置以及其他任何必要的东西来更好地集成独立版本。

如果您想使用缓存支持,您需要添加 wsehcache 以及 启用和配置缓存

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 历史上包含两个库,wsplayWs,分别包含 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.MultipartMultipart 类型,这些类型仅在 Play 中可用,例如

def withBody(body: Source[MultipartFormData.Part[Source[ByteString, _]], _]): Self 

Signpost OAuth 已更改,因此它不再使用 Commons HTTPClient OAuthProvider,而是使用 DefaultOAuthProvider,后者在幕后使用 HTTPURLConnection。

§API 更改

§Scala

WSAPI 类已移除。WSClient 接口是 WS API 的入口点。

WSRequestwithBody[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() 来返回流式结果。

下一步: 缓存迁移


发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区展开讨论。