scala - Scala递归api调用
问题描述
val identifiers = List("id1","id2","id3","id4","id5","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", "id2", "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
}
推荐阅读
- android - 未显示 appcelerator android 应用程序的日志
- amazon-web-services - 我们可以使用 AWS SNS 发送 Web 推送通知吗
- wordpress - 获取 Ionic App 的当前语言
- ios - UINavigation 标题颜色变化问题
- javascript - 谁能告诉我为什么我的 div 是垂直排列而不是水平排列的?
- c - 在c中出现分段错误,但为什么呢?
- ckeditor - CKEditor 从内联编辑器中删除数据目标
- sql - cloudera - 将所有属性更改为大写
- r - 使用 Stan 实现预测后验分布
- angular - 一旦发送消息或在angular2中打开消息,如何使页面自动向下滚动到底部