Play 2.0 中文资料 - Play WS API

有时候我们要在 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 调用结束. 例如:

val homePage: Promise[ws.Response] = WS.url("http://mysite.com").get()

或者:

val result: Promise[ws.Response] = {
  WS.url("http://localhost:9001/post").post("content")
}

获取 HTTP 响应结果

调用是异步的, 返回类型是 Promise[ws.Response], 你必须操作它来得到实际的内容. 你可以组成多个 Promise,最后形成一个 Promise[Result],它可由 Play 服务器直接处理:

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() 方法

WS.url(url).post(Map("key" -> Seq("value")))

类别: PlayFramework, Scala. 标签: , , . 阅读(1,548). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz