Scala 递归 api 调用

Scala recursive api call

val identifiers = List("id1","id2","id3","id4","id5","id5","id7","id8","id9","id10")

列表中有 10 个 ID,我需要使用一些 API 调用来获取所有 ID 信息,它可以是 post 或 get 方法。

但这里的挑战是 API 如果 ID 超过 3 个,returnid 的信息将不会 return 结果。

所以我想 API 以批处理格式调用所有这些 ID。批量大小最大值为 3。因为如果 ID 大于 3,API 将不会 return 结果。

有什么方法可以在 3 号批次中进行 API 调用吗?

curl 中的示例 API

curl --location --request POST 'https://test/search' \
--header 'Content-Type: application/json' \
--data-raw '{
    "request": {
        "filters": {
           "identifier": ["id1", "id2", "id3"]
        }
    }
}'


您可以使用 grouped 按 2 或 3 个(无论您需要什么)元素进行分组。

以下代码展示了如何分组、调用一个 returns Future 的方法并以列表的形式接收所有响应。

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.concurrent.duration._

//Emulate a call that returns a Future
def apiCall(ids: List[String]): Future[String] = Future(ids.mkString("[", ",", "]"))

val ids       = List("ID1", "ID2", "ID3", "ID4", "ID5")
val subIds    = ids.grouped(2).toList
//val responses = Future.sequence(subIds.map(apiCall))
val responses = Future.traverse(subIds)(apiCall)
val all       = Await.result(responses, 2.seconds)
println(all)

这会打印

List([ID1,ID2], [ID3,ID4], [ID5])

您可以使用各种库进行 http 请求,但最简单的(在我看来)是 scalaj-http

apiCall方法可以实现如下

def apiCall(ids: List[String]) = Future {
  import scalaj.http.Http
  val idsAsJsonArray = ids.map(id => "\"" + id + "\"").mkString("[", ",", "]")
  Http("https://test/search")
    .postData(s"""
      |{
      |    "request": {
      |        "filters": {
      |           "identifier": $idsAsJsonArray
      |        }
      |    }
      |}
      |""".stripMargin)
    .header("Content-Type", "application/json")
    .asString
    .body
}