3

经过一番反复试验,我设法在 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 完全陌生。

4

1 回答 1

4

我认为您正在寻找的功能是parseJsonBody_。此外,我认为您不想使用toContentand ,而是使用jsonToRepJson。所以总的来说,你可以将你的代码表达为:show

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

虽然我不完全确定你为什么用客户刚刚提交的数据做出回应。

于 2012-05-22T15:55:44.623 回答