当前位置: 首页 > 知识库问答 >
问题:

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

许典
2023-03-14

我正在Play with Scala中开发一个REST服务器,在某些时候需要请求一个或多个其他Web服务的数据。根据这些服务的响应,服务器必须编写一个统一的结果供以后使用。

例子:

需要执行 www.someplace.com 上的事件 C。为了执行事件 C,还必须执行 www.anotherplace.com 上的事件 A 和 www.athirdplace.com 上的事件 B。

事件C有一个< code>Seq(www.anotherplace.com,www.athirdplace.com),我想从这个Seq开始迭代并向每个URL分别发送一个WS请求,以检查B和C是否被执行。

假设对这些 URL 的 GET 返回 truefalse

我如何从每个请求中收集响应(最好组合成一个列表)并断言每个响应都等于< code>true?

编辑:事件可能包含任意数量的URL。因此,我无法事先知道需要发送多少WS请求。

共有2个答案

汪理
2023-03-14

看看文档,看看你是否能让他们的例子工作。试着这样做:

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

您可能需要解析web服务的响应,因为它们(可能)不会返回布尔值,但您会明白这一点。

程沛
2023-03-14

您可以使用未来对象上可用的序列方法。

例如:

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()))

请注意,< code>futureResponses的类型将是< code > Future[Seq[ws response]]。现在您可以处理结果:

futureResponses.map { responses =>
  responses.map { response =>
    val body = response.body
    // do something with response body
  }
}

来自序列方法的ScalaDocs:

将可遍历的Once[Future[A]]转换为一个Future[TraversableOnce[A]]。有助于将许多期货减少到一个单一的未来。

请注意,如果传递给序列的任何未来失败,则生成的将来也将失败。只有成功完成所有未来后,结果才会成功完成。这对于某些目的很好,尤其是如果您希望同时发送请求,而不是一个接一个地发送请求。

 类似资料:
  • 我试图将json对象列表从Javascript发送到Spring Boot后端。这是我的函数在前端的外观: 所以我发送了一个类似:[{“name”:“foo1”,“description”:“bar1”,“value”:“4”},{“name”:“foo2”,“description”:“bar2”,“value”:“10”}] 但我在后端无法捕捉到它: AssetDto看起来像: 因此,在本例中

  • 问题内容: 我想创建一个将(排序的)列表作为其参数并输出包含每个元素的相应百分位数的列表的函数。 例如,return 。 任何人都可以请: 帮我纠正下面的代码吗?要么 提供比我的代码更好的替代方法,用于将列表中的值映射到它们对应的百分位数? 我当前的代码: 当前,如果我提交,则返回列表。 问题答案: 我认为您的示例输入/输出与典型的百分位数计算方法不符。如果将百分位数计算为“数据点的比例严格小于此

  • ...但我得到: 我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),所以MapStruct知道如何像这样映射列表类型的每个字段: ...但我收到错误消息

  • 我有一个类型的变量,其中item如下所示: 我想将其重新排序为,其中键是customerId,然后值是具有该客户ID的所有项的列表。

  • 问题内容: [‘a’,’a’,’b’,’c’,’c’,’c’] 至 和 问题答案: x=[‘a’,’a’,’b’,’c’,’c’,’c’] >>> map(x.count,x) [2, 2, 1, 3, 3, 3] >>> dict(zip(x,map(x.count,x))) {‘a’: 2, ‘c’: 3, ‘b’: 1} >>>

  • 我正在尝试在我的应用程序中注入列表。我的Spring Boot应用程序中Java对象列表的yml文件。 我已经看到了其他类似问题的一些答案,这些问题将Yaml中的列表映射到Spring Boot中的对象列表,但我有不同的输出错误。 我的YAML文件 我还创建了Bucket类 以及我的配置类,我在其中将列表注入YAML 当Spring Boot开始执行时,我出现以下错误: 我也尝试过简单的字符串列表