2012-05-22 2 views
3

약간의 시행 착오 끝에 Yesod에서 JSON POST에서 객체를 잡고 EventFolder 엔티티를 만들고 데이터베이스에 저장하기 위해 다음 기능을 생성했습니다.Yesod에서 "extractEntityFromPostedJson"을 어떻게 추출 할 수 있습니까?

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 

주 같은 것을 끝낼 싶습니다.

답변

4

찾고있는 기능이 parseJsonBody_이라고 생각합니다. 또한 toContentshow을 사용하는 대신 jsonToRepJson을 사용하고 싶다고 생각합니다. 그래서 모두 함께, 당신은 아마 당신의 코드를 표현할 수 등 :

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

클라이언트가 단지 제출 된 데이터로 응답하는 이유 나는 완전히 확실하지 않다지만.

+0

대단히 감사합니다. 마음에 들지 않는다면 위의 예를 위해 저장소의 하나를 링크 할 것입니다. https://github.com/snoyberg/yesod-js/blob/master/samples/todo.lhs – lobsterism

+0

@ 응답 문제 : POST에 응답 할 때 다음 세 가지 중 하나를 수행하는 것이 일반적입니다. 어떤 종류의 "상태 확인"메시지를 반환하거나 리디렉션 응답을 보내도록 수정되었습니다. @lobsterism은 대안 1을 선택합니다. 만약 당신이'name' ='test_folder'로'/ folder/new'에 POST하고 그 폴더가 이미 존재한다면'{ "name": "test_folder (1)"}'로 응답하여'/ 폴더/test_folder (1)'이 생성되었습니다. 분명히 그 코드는 여기서 구현되지 않습니다. – dflemstr

+0

실제로 응답은 단지 자리 표시 자일뿐입니다. 아직도해야 할 일. . . – lobsterism