haskell - 如何使用通用路由并将它们“挂载”到更大的服务应用程序中?
问题描述
概念
我从 Rails 世界借用了“mount”。这是我在概念上尝试做的事情:
- 在 Servant 中编写一个迷你 web 应用程序,其他人可以在更大的 Servant 应用程序中“包含/安装”它
- 他们应该能够为这个小应用程序的 URL 指定一个“挂载点”(基本上是一个 URL 前缀)。他们还应该能够指定身份验证以访问此迷你应用程序(强烈推荐!)
- 这个迷你应用程序中使用的各种
safeLinks
应该尊重这个“安装点”(否则所有链接最终都会是 404)。
细节
以下是具体情况:
我在库中有一堆odd-jobs
看起来像这样的仆人路线:
data Routes route = Routes
{ rFilterResults :: route :- QueryParam "filters" Filter :> Get '[HTML] (Html ())
, rStaticAssets :: route :- "assets" :> Raw
, rEnqueue :: route :- "enqueue" :> Capture "jobId" JobId :> Post '[HTML] NoContent
, rRunNow :: route :- "run" :> Capture "jobId" JobId :> Post '[HTML] NoContent
, rCancel :: route :- "cancel" :> Capture "jobId" JobId :> Post '[HTML] NoContent
, rRefreshJobTypes :: route :- "refresh-job-types" :> Post '[HTML] NoContent
, rRefreshJobRunners :: route :- "refresh-job-runners" :> Post '[HTML] NoContent
} deriving (Generic)
我有一个单独的OddJobs.Links
模块,它使用该RecordWildCards
技巧在顶级命名空间中获取一堆安全链接生成函数:
Routes{..} = allFieldLinks' absText :: Routes (AsLink Text)
absText :: Link -> Text
absText l = "/" <> (toS $ show $ linkURI l)
作业队列的 web-ui 生成的 HTML 使用这些顶级函数:
form_ [ action_ (Links.rCancel jobId), method_ "post" ] $ do
问题
- 我一直盯着Servant.Links
safeLink
中的, 和相关函数,无法弄清楚的第一个参数是否基本上自动计算出“挂载点”?如果是这样,相应的使用方式(和相关功能)是什么?safeLink
fieldLink
- 您如何“组合”多个 API,每个 API 都定义了一个通用记录,以便您可以为组合的 API 生成安全链接函数(和服务客户端)?
- 我的 HTML 生成函数基本上需要接受“挂载点”作为参数,生成安全链接函数,然后到处传递吗?即我将无法使用该
RecordWildCards
技巧在顶级名称空间中获取这些函数,对吗? - 如果我的库的用户决定在将此迷你应用程序组合成一个更大的服务应用程序时添加基本身份验证,我的实际处理程序会发生什么?
解决方案
推荐阅读
- docker - Webpack 无法在 Github Action Docker 容器中写入构建文件
- sql - 使用窗函数 sum 遇到除以零错误
- flutter - 如何通过使用 Bloc Cubit 和 Bloc Consumer 使用来自 fire 存储的依赖注入来等待数据到来
- python - pyinstaller 的 Cloudscraper 问题
- python - 如何在 SageMaker 中的 model.tar.gz 上创建模型?
- java - liquibaseDiffChangelog gradle 任务因 java.lang.UnsupportedOperationException 出错:应用程序必须提供 JDBC 连接
- c - math.h 的问题
- javascript - TypeError:grid.mongo.ObjectID 不是构造函数
- size - 是否可以同时在同一个桌面上以预定义的尺寸运行两个全屏应用程序?
- three.js - 动画期间身体部位的位置(从 mixamo.com 导入的模型和动画)