使用Warp / WAI处理POST

时间:2011-09-14 21:00:14

标签: haskell haskell-warp

如何使用Network.WaiWarp

从POST请求中检索数据

比方说,我有一个简单的网页

....
<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 个答案:

答案 0 :(得分:10)

只是添加到hammar的答案:wai包本身只是定义了接口,它没有提供任何帮助函数。你要找的是wai-extra包,特别是parseRequestBody。请注意,这使您可以准确控制上载文件的存储方式,例如临时文件或内存中。

答案 1 :(得分:7)

WAI是一个相当低级别的接口,因此POST数据在请求正文中保持未处理状态,就像收到它一样。您应该能够使用requestBody功能获取它。

当然,您必须解析它,因为它通常以application/x-www-form-urlencoded格式编码(或multipart/form-data用于包含文件上传的表单)。我怀疑这个地方可能有辅助功能,但至少在WAI包本身找不到任何功能。