- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 Servant 的 serveWithContext 函数的用途。文档指出它不是 ReaderT Monad 的替代品,但我不确定它试图解决 ReaderT 尚未解决的问题。
例如,这是来自 servant-auth GitHub 页面上的示例:
unprotected :: CookieSettings -> JWTSettings -> Server Unprotected
unprotected cs jwts = checkCreds cs jwts :<|> serveDirectory "example/static"
server :: CookieSettings -> JWTSettings -> Server (API auths)
server cs jwts = protected :<|> unprotected cs jwts
let jwtCfg = defaultJWTSettings myKey
cfg = defaultCookieSettings :. jwtCfg :. EmptyContext
api = Proxy :: Proxy (API '[JWT])
_ <- forkIO $ run 7249 $ serveWithContext api cfg (server defaultCookieSettings jwtCfg)
似乎 serveWithContext 被用来将 Cookie 和 JWT 设置传递给处理程序,但我不明白为什么这不能通过 ReaderT 完成。此外,serveWithContext 似乎分两次传递这些值:一次作为绑定(bind)到 cfg
的 Context 对象,另一次作为函数调用中的参数 server defaultCookieSettings jwtCfg
。
如果有人能为我揭开 Servant 的上下文类型的神秘面纱,我将不胜感激。
最佳答案
Servant
的机制似乎没有对您选择在其中定义处理程序的底层 monad 做出假设。这意味着它不能强制您选择任何特定的 monad(例如 ReaderT
)来响应路由中存在的某些组合器,并且它不会对您选择的 monad 做出“ react ”为了启用某些行为。
对于servant-auth,我们需要提供一些extra information告知如何处理 cookie 等。
Context
系统是如何收集 route
的位置参数中的额外信息的? , hoistServerWithContext
和 serveWithContext
,同时仍然让你选择你想要的任何 monad。参数的确切类型取决于 API 中存在的路由组合器。
servant tutorial有一些关于 Context
的段落:
When someone makes a request to our "private" API, we’re going to needto provide to servant the logic for validating usernames andpasswords. [...] Servant 0.5 introduced Context to handle this. [...]the idea is simple: provide some data to the serve function, and thatdata is propagated to the functions that handle each combinator.
至于
Furthermore, serveWithContext appears to be passing these values intwice
我不确定,但我怀疑 checkCreds
将 cs
和 jwts
作为参数只是作为验证方式的示例如果纯粹在处理程序中完成,则在没有 Servant 本身帮助的情况下执行。相反,protected
端点已经接收到身份验证的结果作为参数;它不必自己执行。
在真实世界的应用程序中,server
不会接受这些参数,它们只会在 Context
中传递。
关于Haskell Servant - serveWithContext 的目的是什么?它做了哪些 ReaderT 做不到的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70059409/
我正在浏览找到的仆人教程 here .有一个部分实现留给用户弄清楚它应该是什么。 type APIFor a i = Get '[JSON] [a] : ReqBody '[JSON
我正在尝试向我的 servant 服务器添加一项功能,该功能将从 Amazon S3 获取文件并将其流式传输回用户。由于文件可能很大,我不想将它们下载到本地然后将它们提供给客户端,我宁愿将它们直接从
我正在尝试使用 Servant 在 Haskell 中构建 Web 服务器,其中部分 API 作为另一个 API 的反向代理。 I found an example 如何实现这一点。但是好像不行: t
我正在关注 the Servant tutorial ,并且我定义了以下 API 类型: type UsersAPI = "users" :> QueryParam "sortby" SortBy :
任何人都可以向我提供一个带有servant-server、wai、warp 等的cookie 的最小示例吗? 例如,具有单个字段“语言”且值为“en”的 Cookie 有没有像 happstack-l
给出以下代码: newtype HelloMessage = HelloMessage { msg :: String } deriving (Generic) instance ToJSON H
我正在使用自定义 monad(带有读取器)轻松地将数据库池等数据传递给我的处理程序(在使用自定义 monad 之前,我曾经将连接作为 fn 参数传递)。 这就是我定义自定义 monad 的方式: ne
我正在这里阅读仆人教程:https://docs.servant.dev/en/stable/tutorial/Server.html#from-combinators-to-handler-argu
我正在尝试按照官方 servant tutorial 使用仆人和松散堆栈来设置基本项目和 stack guide 。一旦我添加 import Servant 堆栈构建就会失败: Could not f
给定以下 Servant 服务器: {-# LANGUAGE DataKinds #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeOpera
使用 servant 时,我想以 JSON 格式返回所有错误。目前,如果请求无法解析,我会看到这样的错误消息,以纯文本形式返回 Failed reading: not a valid json val
我已经使用 Haskell 一年左右了,它太棒了。我最近开始使用Servant;我想使用 SQL 库,例如 Selda,这样一切都是类型安全的。 (当与 Elm 结合时,这真是令人难以置信!:)) 这
默认情况下,即使请求的端点返回 JSON,Servant 也会返回纯字符串请求 $ http $S/signup email=mail@domain.com HTTP/1.1 400 Bad Requ
我有一个仆人应用程序,并针对我的问题查看了以下问题,我收到了 400 个带有 OPTIONS 动词的预检请求: https://github.com/haskell-servant/servant/i
我正在尝试使用 telegram-api 构建一个 Telegram 机器人。到目前为止,我还没有遇到任何问题,因为我可以阅读测试来了解事情是如何工作的,但在使用 Servant 构建 webhook
我有一个带有 rest api 的简单服务应用程序: type API = "items" :> Get '[JSON] [MyData] app :: Application app = serve
我试图了解 Servant 的 serveWithContext 函数的用途。文档指出它不是 ReaderT Monad 的替代品,但我不确定它试图解决 ReaderT 尚未解决的问题。 例如,这是来
我正在尝试将 Servant 身份验证(servant-auth-server 包)与 RIO 作为我的处理程序 monad 结合使用,以避免出现 exceptT 反模式。但是,我无法正确排列类型以处
servant paper简介包含以下示例 API 类型: type Echo = "echo" :> ReqBody ’[PlainText] String
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我是一名优秀的程序员,十分优秀!