首页 > 解决方案 > 一种遍历分页响应 Http4s 的简单方法

问题描述

我正在尝试在不使用字符串插值的情况下处理分页,并且还利用了 http4s 功能。我遇到过OptionalQueryParamDecoderMatcher,我不知道它是否适合我的用例。因此响应包含标题,该标题包含有关 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"

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

有人可以启发我吗?我对你的建议持开放态度。

注意:httpRoute 被指定为这个例子:

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

标签: scalapaginationhttp4s

解决方案


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

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(我发现它出于多种原因更理智),然后将其解释为 HTTP4s。这是一种避免 HTTP4s 或 Akka HTTP 的许多特质的非常简单的方法)。


推荐阅读