2011-09-14 23 views
7

Network.Wai ve Warp kullanarak POST isteğinden nasıl veri alırsınız?Warp/WAI kullanarak POST kullanma

Say örneğin, ben bu verileri almak nasıl basit bir web sayfası kullanıcı tıklama göndermek

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

var? Ben alındığı gibi, POST veri talebi vücutta işlenmemiş bırakılır böylece WAI, oldukça düşük düzeyde arayüzüdür örnek

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? 

cevap

10

Hammar'ın cevabını eklemek için: wai paketinin kendisi sadece arabirimi tanımlar, herhangi bir yardımcı işlev sunmaz. Aradığınız şey, wai-extra paketidir, özellikle parseRequestBody. Bu, yüklenen dosyaların tam olarak nasıl geçici olarak veya bellekte saklandığını kontrol etmenize izin verdiğini unutmayın.

+0

Ayrıca http://langnostic.blogspot.de/2013/04/simple-web-chat-using-haskells-waiwarp.html, parseRequestBody işlevinin nasıl kullanılacağına dair mükemmel bir örnek sağlar. "Wai-extra" belgeleri, "Sink x y" türünün argümanının ayarlanması söz konusu olduğunda biraz hantaldır. – eugenk

7

için veri (queryString)

GET almak için biliyorum. requestBody işlevini kullanarak yakalayabilmeniz gerekir. Tabii

, daha sonra tipik application/x-www-form-urlencoded biçiminde kodlanmış (veya dosya yükleme ile bir form için multipart/form-data) oluyor gibi bunu ayrıştırmak gerekir. Bunun için bir yerlerde yardımcı fonksiyonlar olabileceğinden şüpheliyim, ama en azından WAI paketinde bulamadım.

İlgili konular