Play Framework 2.1(Scala) 调用 WebService 返回 Response

在 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 的代码:
 1package services
 2
 3import play.api.libs.ws._
 4
 5import play.api.libs.json._
 6import scala.concurrent.Future
 7import play.api.libs.concurrent.Execution.Implicits._
 8import com.ning.http.client.Realm.AuthScheme
 9
10import scala.concurrent.Await
11import scala.concurrent.duration.DurationInt
12
13object MyWebService {
14    
15    def getJson(url: String) : Response = {
16      
17//      Future[Response]
18      val responseFuture = WS.url(url).withAuth("name", "pass", AuthScheme.BASIC).get
19      val response = Await.result(responseFuture, 5 seconds)
20      
21//      response.status
22//      response.statusText
23//      response.xml
24//      response.json
25      response
26    }
27}

response 有上面列出的那些属性可以直接获得状态,xml, 或 json 类型数据

看了网上的,其实这个更不错:
 1import play.api.libs.ws.WS
 2import play.api.libs.concurrent.Execution.Implicits._
 3import scala.concurrent.Await
 4import scala.concurrent.duration._
 5import scala.language.postfixOps
 6
 7object WebserviceCallParseXML {
 8
 9  val responseFuture = WS.url("http://api.server.com/rest/")
10    .withAuth("test", "test", com.ning.http.client.Realm.AuthScheme.BASIC)
11    .get()
12
13  val resultFuture = responseFuture map { response =>
14    response.status match {
15      case 200 => Some(response.xml)
16      case _ => None
17    }
18  }
19
20  val result = Await.result(resultFuture, 5 seconds)
21
22  println(if (result.isDefined) result.get else "No result found" )
23
24}

参考: Webservice call in Play2 Scala 永久链接 https://yanbin.blog/play-framework-2-1-scala-webservice-return-response/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。