如何在Yesod中提取“extractEntityFromPostedJson”?

时间:2012-05-22 14:41:37

标签: haskell yesod

经过一些试验和错误后,我设法在Yesod中创建以下函数以从JSON POST中获取对象,创建一个EventFolder实体,并将其保存到数据库中。

postAddEventFolderR :: Handler RepJson
postAddEventFolderR = do
    r <- waiRequest 
    v <- liftIO . runResourceT $ requestBody r $$ sinkParser json
    let v1 :: EventFolder
        v1 = case fromJSON v of
                 Success a -> a
                 Error s   -> error s
    runDB $ insert $ v1
    return $ RepJson $ toContent $ show v1

测试函数看起来像curl -H "Content-Type: application/json" -X POST -d '{"name":"test_folder"}' http://localhost:5000/AddEventFolder

问题是,首先,是否有一种更简洁的方式来编写这个函数 - 它似乎相当冗长。第二,我如何从JSON中提取一般创建对象的函数?所以我想最终得到像

这样的东西
postAddEventFolderR = do
    v1 = extractEntityFromJsonPost (whatever params) :: EventFolder
    runDB $ insert $ v1
    return $ RepJson $ toContent $ show v1

注意我对Haskell完全不熟悉。

1 个答案:

答案 0 :(得分:4)

我认为您正在寻找的功能是parseJsonBody_。此外,我认为您不想使用toContentshow,而是使用jsonToRepJson。总而言之,您可以将代码表达为:

postAddEventFolderR = do
    v <- parseJsonBody_
    runDB $ insert (v :: EventFolder)
    jsonToRepJson v

虽然我不完全确定您为什么要回复客户刚刚提交的数据。