在Play2 Scala中调用Webservice

时间:2013-02-17 22:50:55

标签: scala playframework playframework-2.0 akka playframework-2.1

我想做一些显而易见的事情:调用web服务并将结果保存在数据库中。

我在Akka Actor代码中,我所做的是调用对象方法:

object Service {
  def run {
    val response = WS.url("http://api.server.com/rest/")
    .withAuth("test", "test", com.ning.http.client.Realm.AuthScheme.BASIC)
    .get.value.get.get.body
  }
}

我如何解析身体?我试图在控制台上打印它,但我得到了NotSuchElement异常。

有什么想法吗?如何解析XML的数组,属性和元素?

我在播放版本2.1.0

1 个答案:

答案 0 :(得分:4)

自上一版本以来,情况发生了一些变化。 Play 2.1.0取决于scala.concurrent包而不是他们自己的类:

  • Play Promise现在是Scala Future
  • Play Redeemable现在是Scala Promise

我没有时间对它进行测试,但是根据我收集的文档,它应该是这样的:

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" )

}

有关Future.value的文档:

  

如果未来未完成,则返回值将为None。如果未来完成,如果它包含有效结果,则值为Some(Success(t)),如果包含异常,则为Some(Failure(error))。