如何解决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不会返回结果。
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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。