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

时间:2017-12-22 12:13:25

标签: scala http get future

我有几个必须向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请求的函数(几乎与上面显示的相同),但是我收到错误,因为第一个未来未完成爱好。

1 个答案:

答案 0 :(得分:0)

这里的问题

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

这是在Scala中看到思考的错误方式。我们的想法是转变&#34;例如,使用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