Haskell 如何使用Happstack创建JSON Rest API?JSON主体?

Haskell 如何使用Happstack创建JSON Rest API?JSON主体?,haskell,happstack,Haskell,Happstack,我正在尝试使用Happstack创建JSON REST api。它应该允许带有JSON主体的帖子。我该怎么做?happstack的API中的所有函数似乎都是根据参数名查找的。它认为身体总是url编码的 如果Happstack无法实现,我应该使用哪个框架?好的,下面是我的想法 {-# LANGUAGE OverloadedStrings, DeriveDataTypeable #-} import qualified Data.ByteString.Lazy.Char8 as L import H

我正在尝试使用Happstack创建JSON REST api。它应该允许带有JSON主体的帖子。我该怎么做?happstack的API中的所有函数似乎都是根据参数名查找的。它认为身体总是url编码的


如果Happstack无法实现,我应该使用哪个框架?

好的,下面是我的想法

{-# 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. 
{-#语言重载字符串,DeriveDataTypeable}
将限定数据.ByteString.Lazy.Char8作为L导入
导入hapstack.Server
导入hapstack.Server.Types
导入控制.Monad.IO.Class(liftIO)
导入数据。数据(数据,可键入)
--最容易序列化/反序列化对象
数据单元=单元{x::Int,y::Int}派生(显示,等式,数据,可键入)
--将此函数放在库中的某个位置
getBody::ServerPart L.ByteString
getBody=do
请求返回“”
myRoute::服务器部分响应
myRoute=do

这是正确的解决方案。Happstack.Server.RqData中的代码用于处理url编码和多个/表单数据提交。如果您只需要原始请求主体,那么您只需要将其与takeRequestBody一起使用。在某个时候,速成课程中会有一个AJAX/JSON部分。@Sean Clark,我看到@MadhavanKumar,不止这些。参见haskell单子和do符号