Обработка POST с использованием Warp/WAI
Как вы получаете данные из запроса POST, используя Network.Wai
а также Warp
?
Скажем, например, у меня есть простая веб-страница
....
<form method="POST" action="/handlepost">
<input name="name" type="text" />
<input type="submit" />
</form>
....
Когда пользователь нажимает кнопку отправить, как я могу получить эти данные? Я знаю, как получить данные GET (queryString
)
например
app :: Application
app request = case rawPathInfo request of
"/" -> return $ displayForm
"/handlePost" -> return $ handlepost
_ -> return $ notFound
displayForm :: Response
displayForm = ResponseBuilder
status200
[("Content-Type", "text/html")] $
fromByteString "<form method='POST' action='/handlepost'><input name="name" type="text" /><input type='submit'></form>"
handlePost :: Request -> Response
handlePost req = undefined -- how do I examine the contents of POST?
2 ответа
Просто добавлю к ответу Хаммара: сам пакет wai определяет интерфейс, он не предоставляет никаких вспомогательных функций. То, что вы ищете, это wai-extra
пакет, в частности parseRequestBody
, Обратите внимание, что это позволяет вам точно контролировать, как загруженные файлы хранятся, например, во временных файлах или в памяти.
WAI является интерфейсом довольно низкого уровня, поэтому данные POST остаются необработанными в теле запроса, так же, как они были получены. Вы должны быть в состоянии захватить его, используя requestBody
функция.
Конечно, вам придется проанализировать его, так как он обычно кодируется в application/x-www-form-urlencoded
формат (или multipart/form-data
для формы с загрузкой файлов). Я подозреваю, что где-то здесь могут быть вспомогательные функции, но я не смог найти ни одной в самом пакете WAI, по крайней мере.