【问题标题】:A simple way to iterate over paginated reponse Http4s一种遍历分页响应 Http4s 的简单方法
【发布时间】:2020-11-30 09:28:49
【问题描述】:

我正在尝试在不使用字符串插值的情况下处理分页,并且还利用了 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"
}

【问题讨论】:

  • 我不确定您是在谈论使用 HTTP4s 匹配器从随机字符串中提取分页值还是添加通过 HTTP4s 路由 DSL 解析查询参数的能力。
  • 我正在考虑增加通过 HTTP4s 路由 DSL 解析查询参数的能力

标签: scala pagination http4s


【解决方案1】:

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

【讨论】:

  • 感谢您的回答
猜你喜欢
  • 2013-06-15
  • 2016-07-08
  • 2019-12-11
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多