2011-09-14 19 views
7

¿Cómo recuperar datos de una solicitud POST usando Network.Wai y Warp?manejo posterior usando Warp/WAI

decir, por ejemplo, tengo una página web sencilla

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

Cuando el usuario hace clic someten, ¿cómo puedo recuperar estos datos? Sé cómo llegar llegar los datos (queryString)

por ejemplo

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? 

Respuesta

10

sólo para añadir a la respuesta de Hammar: el propio paquete WAI simplemente define la interfaz, que no proporciona ninguna funciones de ayuda. Lo que está buscando es el paquete wai-extra, en particular parseRequestBody. Tenga en cuenta que esto le permite controlar exactamente cómo se almacenan los archivos cargados, como en los archivos temporales o en la memoria.

+0

también http://langnostic.blogspot.de/2013/04/simple-web-chat-using-haskells-waiwarp.html proporciona un gran ejemplo de cómo se puede utilizar parseRequestBody' '. La documentación 'wai-extra' es un poco engorrosa cuando se trata de establecer el argumento de tipo' Sink x y' right. – eugenk

7

WAI es bastante una interfaz de bajo nivel, por lo que los datos POST se deja sin procesar en el cuerpo de la petición, tal como se recibió. Debería poder tomarlo usando la función requestBody.

Por supuesto, a continuación, tendrá que analizarlo, ya que es normalmente codificada en el formato application/x-www-form-urlencoded (o multipart/form-data para un formulario con la carga de archivos). Sospecho que podría haber funciones de ayuda para esto en alguna parte, pero al menos no pude encontrar ninguna en el paquete WAI.

Cuestiones relacionadas