如何根据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请求?的主要内容,如果未能解决你的问题,请参考以下文章