[英]Send a WS request for each URL in a list and map the responses to a new list
我正在用Scala进行Play开发中的REST服务器,有时需要在一个或多个其他Web服务上请求数据。 根据这些服务的响应,服务器必须组成一个统一的结果,以便以后使用。
范例 :
需要执行www.someplace.com
上的事件C。 为了执行事件C,还必须执行www.athirdplace.com
上的事件A和www.anotherplace.com
事件B。
事件C有一个Seq(www.anotherplace.com, www.athirdplace.com)
,我想从中进行迭代,并将WS请求分别发送到每个URL,以检查B和C是否已执行。
假定这些URL的GET返回true
或false
如何收集每个请求的响应(最好组合到一个列表中)并断言每个响应都等于true
?
编辑 :一个事件可以包含任意数量的URL。 因此,我无法事先知道我需要发送多少个WS请求。
查看文档 ,看看是否可以使他们的示例生效。 尝试这样的事情:
val futureResponse: Future[WSResponse] = for {
responseOne <- WS.url(urlOne).get()
responseTwo <- WS.url(responseOne.body).get()
responseThree <- WS.url(responseTwo.body).get()
} yield responseOne && responseTwo && responseThree
您可能需要解析WebService的响应,因为它们(可能)不会返回布尔值,但是您会明白的。
例如:
import scala.concurrent.Future
val urls = Seq("www.anotherplace.com", "www.athirdplace.com")
val requests = urls.map(WS.url)
val futureResponses = Future.sequence(requests.map(_.get()))
Future
请注意, futureResponses
的类型将为Future[Seq[WSResponse]]
。 现在您可以处理结果了:
futureResponses.map { responses =>
responses.map { response =>
val body = response.body
// do something with response body
}
}
从ScalaDocs的sequence
方法:
将TraversableOnce [Future [A]]转换为Future [TraversableOnce [A]]。 对于将许多期货简化为单个期货很有用。
请注意,如果传递给sequence
任何Future
失败,则生成的Future
也将失败。 仅当所有Future
成功完成时,结果才会成功完成。 这对于某些目的是有好处的,特别是如果您想同时发送请求,一个又一个地发送请求,则尤其如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.