gpt4 book ai didi

forms - 与servant一起处理常规表单帖子(application/x-www-form-urlencoded)

转载 作者:行者123 更新时间:2023-12-02 23:13:28 31 4
gpt4 key购买 nike

我如何使用 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com