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

I think the function you're looking for is parseJsonBody_. Additionally, instead of using toContent and show, I think you'd want to use jsonToRepJson. So all together, you can probably express your code as:

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

Though I'm not entirely certain why you're responding with the data that the client just submitted.

于 2012-05-22T15:55:44.623 に答える