3

免責事項: 私はsttpMonixを初めて使用します。これは、これらのライブラリについて詳しく学ぼうとする私の試みです。私の目標は、HTTP GET 要求を介して特定の API からデータ (クライアント側) を取得することです -> JSON 応答を解析します -> この情報をデータベースに書き込みます。私の質問は最初の部分だけに関係します。私の目的は、レート制限を回避または処理する方法を持ちながら、get リクエストを非同期 (できれば高速) に実行することです。

以下は、私がすでに試したもののスニペットであり、単一のリクエストで機能するようです:

package com.github.client

import io.circe.{Decoder, HCursor}
import sttp.client._
import sttp.client.circe._
import sttp.client.asynchttpclient.monix._
import monix.eval.Task

object SO extends App {

  case class Bla(paging: Int)

  implicit val dataDecoder: Decoder[Bla] = (hCursor: HCursor) => {
    for {
      next_page <- hCursor.downField("foo").downArray.downField("bar").as[Int]
    } yield Bla(next_page)
  }

  val postTask = AsyncHttpClientMonixBackend().flatMap { implicit backend =>
    val r = basicRequest
      .get(uri"https://foo.bar.io/v1/baz")
      .header("accept", "application/json")
      .header("Authorization", "hushh!")
      .response(asJson[Bla])

    r.send() // How can I instead of operating on a single request, operate on multiple
      .flatMap { response =>
        Task(response.body)
      }
      .guarantee(backend.close())
  } 

  import monix.execution.Scheduler.Implicits.global

  postTask.runSyncUnsafe() match {
    case Left(error) => println(s"Error when executing request: $error")
    case Right(data) => println(data)
  }
}

私の質問:

  1. コードを非同期で構成可能に保ちながら、Monix を使用して (単一のリクエストではなく) 複数の GET リクエストを操作するにはどうすればよいですか?
  2. APIサーバーによって課されたレート制限に達するのを回避または処理するにはどうすればよいですか

余談ですが、レート制限の目的をサポートする場合は、別のバックエンドを使用するという点でも柔軟です。

4

1 に答える 1