在 Play Framework 2.1 中用 Scala 编程进行 WebService 调用想返回 Response,或 xml, json 结果时,初入可能会费些功夫,因为无论是 WS.url.get,或 post, put 方法返回的都是个 Future[Response] 对象,也就是如何从 Future[Response] 如何分离出 Response 对象的问题。
这里我们 map, 或 match/case 也可以取出其中 response 对象来,如果要作为结果返回还要用到 Await.result() 方法。
为了不把代码出现在摘在页面中,这里插点内容,像是拖延时间的战术。
如果你在使用 Play Framework 2 with Scala 时碰到这个错误:
Error: Cannot find an implicit ExecutionContext, either require one yourself or import ExecutionContext.Implicits.global
依照 899 号 Issue, 解决办法是你必须加上这个引入语句:
import play.api.libs.concurrent.execution.Implicits._
因为里面有我们需要用到的隐式的 global 吧。
下面是我用来请求 WebService 返回 Response 的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package services import play.api.libs.ws._ import play.api.libs.json._ import scala.concurrent.Future import play.api.libs.concurrent.Execution.Implicits._ import com.ning.http.client.Realm.AuthScheme import scala.concurrent.Await import scala.concurrent.duration.DurationInt object MyWebService { def getJson(url: String) : Response = { // Future[Response] val responseFuture = WS.url(url).withAuth("name", "pass", AuthScheme.BASIC).get val response = Await.result(responseFuture, 5 seconds) // response.status // response.statusText // response.xml // response.json response } } |
response 有上面列出的那些属性可以直接获得状态,xml, 或 json 类型数据
看了网上的,其实这个更不错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import play.api.libs.ws.WS import play.api.libs.concurrent.Execution.Implicits._ import scala.concurrent.Await import scala.concurrent.duration._ import scala.language.postfixOps object WebserviceCallParseXML { val responseFuture = WS.url("http://api.server.com/rest/") .withAuth("test", "test", com.ning.http.client.Realm.AuthScheme.BASIC) .get() val resultFuture = responseFuture map { response => response.status match { case 200 => Some(response.xml) case _ => None } } val result = Await.result(resultFuture, 5 seconds) println(if (result.isDefined) result.get else "No result found" ) } |
参考: Webservice call in Play2 Scala