一种迭代分页响应 Http4 的简单方法

A simple way to iterate over paginated reponse Http4s

我正在尝试在不使用字符串插值的情况下处理分页,并且还利用了 http4s 功能。 我遇到了 OptionalQueryParamDecoderMatcher,但我不知道它是否适合我的用例。 因此,响应包含 header,其中包含有关 Link 属性中页数的信息 它已将 rel 设置为 prev、next、first 或 last。如下:

<https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="prev", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="next", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="first", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="last"

我的想法是获取最后指定的页数(即总页数),然后自增1得到所有结果。 我想到的第一种方法是字符串插值,但我相信会有更简单的方法来实现它,尤其是利用 http4s。

谁能赐教一下?我愿意接受你的建议。

注意:httpRoute 指定为本示例:

 val routes   = HttpRoutes.of[IO] {
      case GET -> Root /"projects"/project_name/"Details"
}

in documentation所述,您可以使用查询匹配器从查询中提取数据。

object Page extends OptionalQueryParamDecoderMatcher[Int]("page")
object PerPage extends OptionalQueryParamDecoderMatcher[Int]("per_page")

val routes = HttpRoutes.of[IO] {
  case GET -> Root / "projects" / project_name / "Details" :? Page(page) :? PerPage(perPage) =>
    ...
}

OptionalQueryParamDecoderMatcherand确实是正确的用法。

(就个人而言,我更喜欢使用 Tapir 或 Endpoint4s 之类的东西来定义 API(出于多种原因,我发现它更明智),然后将其解释为 HTTP4。这是避免 HTTP4 的许多特性的一种非常简单的方法或 Akka HTTP)。