scala - 一种遍历分页响应 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"
}
解决方案
如文档中所述,您可以使用查询匹配器从查询中提取数据。
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 的许多特质的非常简单的方法)。
推荐阅读
- c++ - 如何防止在 C++ 中访问 dll 中的函数
- sql - 是否可以在win10上安装DB2以供C程序访问,使用Cygwin?
- vue.js - Vue路由器重定向命名组件不缺少参数?
- html - CDK 虚拟卷轴没有 dom
- sql - 条件连接 SQL 如何连接
- c++ - v.size()-1 背后的逻辑?
- python - 对于折线图(matplotlib,pandas)的数据框中缺少 x 值,如何将 y 值设置为 0
- pywinauto - 无法使用 PyWinAuto 单击按钮
- firebase - 如何使用颤振网络从 Firebase 电话身份验证中删除验证码?
- node.js - 如何在钩子前在摩卡咖啡中使用 async/await?