2012-01-14 19 views
6

Estoy tratando de crear una api JSON REST usando Happstack. Debe permitir POSTS con un cuerpo JSON. ¿Cómo puedo hacer esto? Todas las funciones en la API de happstack parecen buscar cosas en función del nombre del parámetro. Cree que el cuerpo siempre está codificado en url.¿Cómo crear JSON Rest API con Happstack? Cuerpo JSON?

Si no es posible con Happstack, ¿qué marco debo usar?

Respuesta

6

Bien, esto es lo que descubrí.

{-# LANGUAGE OverloadedStrings, DeriveDataTypeable #-} 
import qualified Data.ByteString.Lazy.Char8 as L 
import Happstack.Server 
import Happstack.Server.Types 
import Control.Monad.IO.Class (liftIO) 

import Data.Data (Data, Typeable) 

-- easiest to serialize/deserialize objects 
data Unit = Unit { x :: Int, y :: Int } deriving (Show, Eq, Data, Typeable) 

-- put this function in a library somewhere 
getBody :: ServerPart L.ByteString 
getBody = do 
    req <- askRq 
    body <- liftIO $ takeRequestBody req 
    case body of 
     Just rqbody -> return . unBody $ rqbody 
     Nothing  -> return "" 

myRoute :: ServerPart Response 
myRoute = do 
    body <- getBody -- it's a ByteString 
    let unit = fromJust $ A.decode body :: Unit -- how to parse json 
    ok $ toResponse $ A.encode unit -- how to send json back. 
+1

Esa es la solución correcta. El código en Happstack.Server.RqData es para tratar con envíos codificados en url y múltiples/datos de formulario. Si solo necesita el cuerpo de solicitud sin procesar, entonces simplemente tómelo con takeRequestBody. En algún punto en el tiempo habrá una sección de AJAX/JSON en el curso intensivo. – stepcut

+0

@Sean Clark, veo <- usado ampliamente en este código. ¿Es una declaración de asignación (o) más que eso? como, 'cuerpo <- getBody'. El valor de retorno de getBody se da a la variable de cuerpo –

+0

@MadhavanKumar es más que eso. Ver las mónadas de Haskell y notación de Do – Bladt