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
}
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
}