8

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

どうすれば物事をつなぎ合わせることができますか?

4

2 に答える 2

3

Servant は、データ型FormUrlEncodedとクラスFromFormUrlEncoded ( FromFormServant 0.9 で名前が変更されました) を介してこれをサポートします。

まず、フォーム データのデータ型を定義し、それを受け入れるようにハンドラーを書き直します。

data CheckRequest = CheckRequest { code :: Text }

checkCode :: CheckRequest -> Handler CheckResult
checkCode (CheckRequest code) = if code == "secret" then Correct else Wrong

次に、 type の POST 本文を指定しますapplication/x-www-form-urlencoded

type API = "check"
         :> ReqBody '[FormUrlEncoded] CheckRequest
         :> Post '[HTML] CheckResult

あとはCheckRequest、 のインスタンスを作成するだけですFromFormUrlEncoded

instance FromFormUrlEncoded CheckRequest where
  --fromFormUrlEncoded :: [(Text, Text)] -> Either String CheckRequest
  fromFormUrlEncoded [("code", c)] = Right (CheckRequest c)
  fromFormUrlEncoded _             = Left "expected a single field `code`"
于 2016-10-02T17:34:47.187 に答える