Обработка POST-запроса в Wai/Warp в Haskell
У меня есть приложение wai/warp. Как я могу обработать почтовый запрос? У меня есть это:
app :: Application
app request respond =
respond $ case rawPathInfo request of
"/" -> responseFile status200 ............
"/some_post_req/" -> .....
Как я могу указать, что some_post_req
должен быть POST?
2 ответа
Это должно быть так же просто, как сравнение результата Network.Wai.requestMethod
против Network.Wai.methodPost
:
app request respond
| requestMethod request == methodPost
= respond $ case rawPathInfo request of
{- handle POST routes -}
| otherwise
= {- handle other request methods -}
Поскольку есть константы для methodPost
, methodGet
и т. д., вы можете использовать их, но Method
это псевдоним для ByteString
так что вы также можете использовать OverloadedStrings
расширение:
{-# LANGUAGE OverloadedStrings #-}
А затем либо сравните со строковым литералом:
requestMethod request == "POST"
Или образец соответствия:
case requestMethod request of
"POST" -> {- … -}
"GET" -> {- … -}
…
parseRequestBody
в wai-extra
Пакет позволяет получить нужные данные из тела запроса:
(params, files) <- parseRequestBody lbsBackEnd request
Но это ничего не значит, чтобы указать, что запрос должен быть POST
запрос. Имейте в виду, что wai
может быть довольно низкого уровня, и есть пакеты более высокого уровня.
servant
приходит в голову как пакет, который позволяет вам определять API на уровне типа. С помощью servant вы определенно можете указать ожидаемый HTTP-глагол. Смотрите здесь.