有一个 REST api,它返回一个带有 json 列表(命名结果)的 json 和一个指向下一批结果的 url(对于最后一个“页面”,这个 url 等于 null)。我想汇总整个结果(将所有 json 列表连接成一个)。我正在使用 spray-client 来执行 GET 请求,这就是我想出的:
val request: HttpRequest => Future[MyResponse] = sendReceive ~> unmarshal[MyResponse]
def getCandidatesStartingFrom(url: String): Future[List[Candidate]] =
request(Get(url)).flatMap {
response =>
val next = response.next match {
case Some(nextUrl) => getCandidatesStartingFrom(nextUrl)
case None => Future.successful(Nil)
}
next.map(response.results ++ _)
}
我的问题是:有没有办法让它更实用?(避免递归或使其尾递归?)。甚至,spray 是否支持惯用的这种聚合?