- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何使用 Servant 处理常规表单 POST?特别是,给定一个 HTML 表单,例如
<form action="/check" method="post">
Solution:
<input name="code" type="text">
<input type="submit">
</form>
和
data CheckResult = Correct | Wrong
instance ToHtml CheckResult
...
checkCode :: Text -> Handler CheckResult
checkCode code = if code == "secret" then Correct else Wrong
如何将事物串在一起?
最佳答案
我只是想为最新版本的 Servant 添加答案,因为我必须通过谷歌搜索各种内容才能组装一个完整的、工作版本的表单处理。
上面的答案适用于早期版本的 Servant,但在升级到 Servant 0.9 时,我在使用表单时遇到了困难。
我是这样做的。
首先,他们从自定义 Form 实现切换到 http-api-data 中的实现。 ,所以你需要在你的 cabal 文件中使用它:
some-project.cabal
build-depends: base >= 4.7 && < 5
, aeson
, blaze-html
, http-api-data
接下来,您可以像上面一样声明一个表单,但您可以使用 GHC.Generics
自动派生 FromForm
实例:
{-# LANGUAGE DeriveGeneric #-}
module Html.Contact where
import GHC.Generics
import Servant
import Web.FormUrlEncoded (FromForm)
data ContactForm = ContactForm
{ cname :: !T.Text
, cemail :: !T.Text
, cmessage :: !T.Text
} deriving (Eq, Show, Generic)
instance FromForm ContactForm
之后,您可以在端点中使用 Servant 的常规 FormUrlEncoded
ContentType:
type ContactApi = "contact" :> ReqBody '[FormUrlEncoded] ContactForm
:> Post '[HTML] Html
差点忘了:如何渲染这个东西
您可能还需要一个页面,您可以在其中显示表单?那么,“name”属性必须与表单中的字段相匹配(这是我的做法,使用 Blaze
):
contactForm :: H.Html
contactForm = H.section ! A.id "contact" ! A.class_ "container contact-us u-full-width u-max-full-width" $
H.div ! A.class_ "row" $ do
H.div ! A.class_ "eight columns contact-us-form" $
H.form ! A.method "post" ! A.action "/contact" $ do
H.div ! A.class_ "row" $ do
H.div ! A.class_ "six columns" $
H.input ! A.class_ "u-full-width" ! A.type_ "text" ! A.name "cname" ! A.placeholder "Name" ! A.id "nameInput"
H.div ! A.class_ "six columns" $
H.input ! A.class_ "u-full-width" ! A.type_ "text" ! A.name "cemail" ! A.placeholder "Email" ! A.id "emailInput"
H.textarea ! A.class_ "u-full-width" ! A.name "cmessage" ! A.placeholder "Message" ! A.id "messageInput" $ ""
H.input ! A.class_ "button u-pull-right" ! A.type_ "submit" ! A.value "Send"
关于forms - 与servant一起处理常规表单帖子(application/x-www-form-urlencoded),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39819729/
我正在浏览找到的仆人教程 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
我是一名优秀的程序员,十分优秀!