如何根据Scala中以前的未来响应发出多个HTTP GET请求?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据Scala中以前的未来响应发出多个HTTP GET请求?相关的知识,希望对你有一定的参考价值。

我有几个函数必须向REST API发出GET请求。为了使代码工作,我需要同步进行这些调用,因为我必须传递一些属于前一个响应的参数。

想象一下,我有这个功能:

def getLocations(region: String, key: String): List[(Int, Int, String)] = {

    // ************1.*************
    val getLocationsURL = url("https://api.transitfeeds.com/v1/getLocations?").GET <<? List("key" -> key)

    val response: Future[String] = Http.configure(_ setFollowRedirects true)(getLocationsURL OK as.String)

    //Evaluamos respuesta de la página
    response onComplete {
      case Success(content) => {
        //Make json
        val json = (parse(content) \\ "results" \\ "locations").children

        for (loc <- json) {

          //Extract all locations
          val locations = loc.extract[List[Locations]]

          /*
          val countries = (locations.filter(w => w.t.contains(inputCountry))).map((x=> (x.id, x.pid, x.n)))
          println(countries) //id, pid, n. Now we already have the list of regions interested in
          */

          val regions = (locations.filter(w => w.n.contains(inputRegion))).map((x => (x.id, x.pid, x.n)))
          println(regions) //id, pid, n. Now we already have the region interested in (only 1)
          finalRegion = regions

        }
      }

      case Failure(t) => {
        println("An error has occured: " + t.getMessage)

      }
    }
    return finalRegion

  }

现在我需要将finalRegion的结果插入另一个将发出另一个HTTP GET请求的函数(几乎与上面显示的相同),但是我收到一个错误,因为第一个未来还没有完成。

答案

这里的问题

你在这里要做的是返回一个尚未计算的结果。函数返回结果后实际调用onComplete。 (顺便说一句,我认为你已经忘记初始化你的可变finalRegion

这是在Scala中看到思考的错误方式。这个想法是用map“改变”未来。如果您有val resp: Future[Response] = ...,如果您想获取状态代码,您可以做的是resp.map(response => response.statusCode)。表达式的类型是Future[Int]

对期货进行排序

一旦你有了你的功能:

  • def getLocations(region: String, key: String): Future[List[(Int, Int, String)]]
  • def anotherFunctionWhichReturnsAFuture(locations: List[(Int, Int, String)]): Future[Something]

如果要将第一个函数(getLocations)的结果传递给第二个函数(anotherFunctionWhichReturnsAFuture),则会出现问题,因为类型不适合。你想摆脱未来。为此你可以使用for

这是一个例子:

for { 
    locations <- getLocations("Maine et Loire", "49")
    result <- anotherFunctionWhichReturnsAFuture(locations)
} yield result

以上是关于如何根据Scala中以前的未来响应发出多个HTTP GET请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在组件之间共享来自 http 响应的数据?

Scala:我如何根据行数将数据帧拆分为多个 csv 文件

如何根据多个因素对 Scala 中的“映射”值进行排序?

如何使用Scala / Akka Http处理多个HTTP头

如何发出 jsonp 请求

如何在laravel 5.2中控制多个ajax请求