Scala递归api调用

问题描述

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

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

但是这里面临的挑战是如果id大于3,返回id信息的API将不会返回结果。

所以我想以批处理格式对所有这些ID进行API调用。批处理的最大大小为3。由于ID超过3,API不会返回结果。

有什么方法可以批量进行3个API调用吗?

curl中的示例API

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


解决方法

您可以使用grouped按2或3(根据需要)元素进行分组。

以下代码显示了如何分组,调用返回Future的方法以及以List形式接收所有响应的方法。

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
}