有时候我们要在 Play 应用中调用其他的 HTTP 服务. Play 是通过它的 play.api.libs.ws.WS
库对此支持的, 该库提供了进行异步的 HTTP 调用.
任何由 play.api.libs.ws.WS
发出的调用都必须返回 Promise[play.api.libs.ws.Response],
我们可以接着可用 Play 的异步机制来处理它.
Unmi 注: 这里有必须挪出 Play 1 和 Play 2 的 WS 稍加对比:
Play 1 中 play.libs.WS 类,Play 2 里是 play.api.libs.ws.WS,Play 2 中许多给外部调用的 API 都放在 play.api.libs 包中了。
Play 1 的 play.libs.WS.WSRequest 中有 get():HttpResponse, getAsync():Promise<HttpResponse>, put():HttpResponse, putAsync():Promise<HttpResponse>,它把同步和异步调用分得很清楚。
而 Play 2 的 play.api.libs.ws.WS.WSRequestHolder 里只有 get(): Promise<Response>, post(): Promise<Response> 这样方法,在这个位置上,它不再分同步还是调用,这个任务交给 Async 方法去决定。
对异步请求的数据获仍然是由 Action 处理,如 Play 1 中 Action 的各个 await() 方法; Play 2 里的 Action 用 Async 方法。
进行 HTTP 调用
要发送一个 HTTP 请求你要从 WS.url()
指定一个 URL 开始. 然后你得到一个构建器,你能用它指定各种 HTTP 选项, 像设置请求头之类的. 最后根据你要的 HTTP method 调用相应的方法,至此一个 HTTP 调用结束. 例如:
1 |
val homePage: Promise[ws.Response] = WS.url("http://mysite.com").get() |
或者:
1 2 3 |
val result: Promise[ws.Response] = { WS.url("http://localhost:9001/post").post("content") } |
获取 HTTP 响应结果
调用是异步的, 返回类型是 Promise[ws.Response], 你必须操作它来得到实际的内容
. 你可以组成多个 Promise,最后形成一个 Promise[Result],它可由
Play 服务器直接处理:
1 2 3 4 5 6 7 |
def feedTitle(feedUrl: String) = Action { Async { WS.url(feedUrl).get().map { response => Ok("Feed title: " + (response.json \ "title").as[String]) } } } |
Post url-form-encoded 数据
欲 post url-form-encoded 数据,需要构造出一个 Map[String, Seq[String]],然后传递给
post() 方法
1 |
WS.url(url).post(Map("key" -> Seq("value"))) |
本文链接 https://yanbin.blog/play2-0-tutorials-cn-ws-api/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。