2011-09-14 62 views
7

如何使用Network.WaiWarp從POST請求中檢索數據?使用Warp/WAI處理POST

比方說,我有一個簡單的網頁

.... 
<form method="POST" action="/handlepost"> 
    <input name="name" type="text" /> 
    <input type="submit" /> 
</form> 
.... 

當用戶點擊提交,我怎麼能找回這些數據?我知道如何獲得GET例如

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? 

回答

10

只需添加到hammar的答案:wai包本身只是定義了接口,它不提供任何幫助函數。你要找的是wai-extra包,特別是parseRequestBody。請注意,這可以讓您精確控制上傳文件的存儲方式,如臨時文件或內存中。

+0

另外http://langnostic.blogspot.de/2013/04/simple-web-chat-using-haskells-waiwarp.html提供了一個關於如何使用'parseRequestBody'的很好的例子。在設置'Sink x y'類型的參數時,'wai-extra'文件有點麻煩。 – eugenk

7

數據(queryString

WAI是一個相當低的水平接口,所以POST數據留在請求主體未處理的,只是因爲它是收到。您應該可以使用requestBody函數來抓取它。

當然,您將不得不解析它,因爲它通常以application/x-www-form-urlencoded格式編碼(或者multipart/form-data爲帶有文件上載的表單)。我懷疑在某個地方可能會有助手功能,但至少在WAI軟件包本身中找不到任何東西。