Web services 为列表中的每个URL发送WS-request,并将响应映射到新列表
我正在开发一个使用Scala的REST服务器,在某些情况下需要在一个或多个其他web服务上请求数据。基于这些服务的响应,服务器必须组成一个统一的结果,以便以后使用 示例: 需要执行Web services 为列表中的每个URL发送WS-request,并将响应映射到新列表,web-services,scala,http,playframework,Web Services,Scala,Http,Playframework,我正在开发一个使用Scala的REST服务器,在某些情况下需要在一个或多个其他web服务上请求数据。基于这些服务的响应,服务器必须组成一个统一的结果,以便以后使用 示例: 需要执行www.someplace.com上的事件C。要执行事件C,还必须执行www.anotherplace.com上的事件A和www.athirdplace.com上的事件B 事件C有一个序列(www.anotherplace.com,www.athirdplace.com),我想从中迭代并分别向每个URL发送WS请求,以
www.someplace.com
上的事件C。要执行事件C,还必须执行www.anotherplace.com
上的事件A和www.athirdplace.com
上的事件B
事件C有一个序列(www.anotherplace.com,www.athirdplace.com)
,我想从中迭代并分别向每个URL发送WS请求,以检查是否执行了B和C
假设访问这些URL返回true
或false
如何收集每个请求的响应(最好合并到列表中),并断言每个响应都等于true
编辑:事件可能包含任意数量的URL。因此,我无法事先知道需要发送多少WS-requests。请看一看,看看是否可以让他们的示例正常工作。
试着这样做:
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
val futuresponse:Future[WSResponse]=for{
回答一个简短的回答
您可以使用对象上可用的方法
例如:
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()))
聚合未来
请注意,futuresponses
的类型将是Future[Seq[WSResponse]]
。现在您可以处理结果:
futureResponses.map { responses =>
responses.map { response =>
val body = response.body
// do something with response body
}
}
更多细节
从<代码>顺序
方法的开始:
将可遍历的Once[Future[a]]转换为
Future[TraversableOnce[A]]。用于将许多期货减少为
单一未来
请注意,如果传递给
序列的Future
中的任何一个失败,则生成的Future
也将失败。只有当所有Future
成功完成时,结果才会成功完成。这对于某些目的很好,特别是如果您希望同时发送请求,则以后不会有人发送请求r另一个。我见过发送多个请求的模式,但是它不起作用,因为一个事件可以有任意数量的URL进行检查。很抱歉,这不清楚,我将把它添加到我的第一篇文章中。但是无论如何,谢谢!使用Seq
上的映射和/或折叠
,然后使用结果。你能提供一个例子吗示例?关于如何使用map和fold Left?这些是标准scala集合的功能。只需谷歌一下,就有很多示例。