繁体   English   中英

为列表中的每个URL发送WS请求,并将响应映射到新列表

[英]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返回truefalse

如何收集每个请求的响应(最好组合到一个列表中)并断言每个响应都等于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的响应,因为它们(可能)不会返回布尔值,但是您会明白的。

简短答案

您可以使用Future对象上可用的sequence方法。

例如:

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
  }
}

更多细节

ScalaDocssequence方法:

将TraversableOnce [Future [A]]转换为Future [TraversableOnce [A]]。 对于将许多期货简化为单个期货很有用。

请注意,如果传递给sequence任何Future失败,则生成的Future也将失败。 仅当所有Future成功完成时,结果才会成功完成。 这对于某些目的是有好处的,特别是如果您想同时发送请求,一个又一个地发送请求,则尤其如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM