2011-09-14 2 views
7

Come si recuperano i dati da una richiesta POST utilizzando Network.Wai e Warp?Gestione di POST tramite Warp/WAI

Dire per esempio, ho una semplice pagina web

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

Quando l'utente fa clic presentare, come posso recuperare questi dati? So come ottenere i dati GET (queryString)

ad esempio

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? 

risposta

10

Solo per aggiungere alla risposta di hammar: il pacchetto wai stesso definisce solo l'interfaccia, non fornisce alcuna funzione di supporto. Quello che stai cercando è il pacchetto wai-extra, in particolare parseRequestBody. Tieni presente che questo ti consente di controllare esattamente come vengono archiviati i file caricati, come nei file temporanei o in memoria.

+0

Anche http://langnostic.blogspot.de/2013/04/simple-web-chat-using-haskells-waiwarp.html fornisce un ottimo esempio di come può essere utilizzato 'parseRequestBody'. La documentazione 'wai-extra' è un po 'macchinosa quando si tratta di impostare l'argomento di tipo' Sink x y' giusto. – eugenk

7

WAI è piuttosto un'interfaccia a basso livello, quindi i dati POST viene lasciata allo stato naturale nel corpo della richiesta, così come è stato ricevuto. Dovresti essere in grado di afferrarlo usando la funzione requestBody.

Ovviamente, sarà necessario analizzarlo, in quanto è tipicamente codificato nel formato application/x-www-form-urlencoded (o multipart/form-data per un modulo con caricamento file). Sospetto che possano esserci delle funzioni di supporto da qualche parte, ma non sono riuscito a trovarne nessuna nel pacchetto WAI stesso, almeno.