Обработка 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, по крайней мере.

Другие вопросы по тегам