【问题标题】:Webservice call in Play2 ScalaPlay2 Scala 中的 Web 服务调用
【发布时间】:2013-02-02 08:05:07
【问题描述】:

我想做一些看似简单的事情:调用网络服务并将结果保存到数据库中。

我在 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 的数组、属性、元素?

我在play版本2.1.0

【问题讨论】:

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


    【解决方案1】:

    与上一个版本相比,情况发生了一些变化。 Play 2.1.0 依赖于scala.concurrent 包而不是它们自己的类:

    • Play Promise 现在是 Scala Future
    • A 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。如果 future 完成,如果它包含有效结果,则值为 Some(Success(t)),如果包含异常,则值为 Some(Failure(error))。

    【讨论】:

    • 它工作得很好,无需测试就可以尝试!但是,问题的最后一部分丢失了。如何将 Some(response.xml) 转换为表示 XML 的案例类?
    • 这只是普通的 Scala xml 处理。也许这篇文章可以帮助你开始:bcomposes.wordpress.com/2012/05/04/…
    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多