Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 为列表中的每个URL发送WS-request,并将响应映射到新列表_Web Services_Scala_Http_Playframework - Fatal编程技术网

Web services 为列表中的每个URL发送WS-request,并将响应映射到新列表

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请求,以

我正在开发一个使用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请求,以检查是否执行了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集合的功能。只需谷歌一下,就有很多示例。