经过一些试验和错误后,我设法在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完全不熟悉。
答案 0 :(得分:4)
我认为您正在寻找的功能是parseJsonBody_。此外,我认为您不想使用toContent
和show
,而是使用jsonToRepJson。总而言之,您可以将代码表达为:
postAddEventFolderR = do
v <- parseJsonBody_
runDB $ insert (v :: EventFolder)
jsonToRepJson v
虽然我不完全确定您为什么要回复客户刚刚提交的数据。