2012-01-14 2 views
6

해피 스택을 사용하여 JSON REST API를 만들려고합니다. JSON 본문이있는 POSTS를 허용해야합니다. 어떻게해야합니까? happstack의 API에있는 모든 함수는 매개 변수 이름을 기반으로하는 것으로 보입니다. 그것은 시체가 항상 url-encoded라고 생각합니다.Happstack으로 JSON Rest API를 만드는 방법은 무엇인가요? JSON 본문?

Happstack에서 가능하지 않은 경우 어떤 프레임 워크를 사용해야합니까?

답변

6

좋아, 내가 알아 낸 것이있다.

{-# LANGUAGE OverloadedStrings, DeriveDataTypeable #-} 
import qualified Data.ByteString.Lazy.Char8 as L 
import Happstack.Server 
import Happstack.Server.Types 
import Control.Monad.IO.Class (liftIO) 

import Data.Data (Data, Typeable) 

-- easiest to serialize/deserialize objects 
data Unit = Unit { x :: Int, y :: Int } deriving (Show, Eq, Data, Typeable) 

-- put this function in a library somewhere 
getBody :: ServerPart L.ByteString 
getBody = do 
    req <- askRq 
    body <- liftIO $ takeRequestBody req 
    case body of 
     Just rqbody -> return . unBody $ rqbody 
     Nothing  -> return "" 

myRoute :: ServerPart Response 
myRoute = do 
    body <- getBody -- it's a ByteString 
    let unit = fromJust $ A.decode body :: Unit -- how to parse json 
    ok $ toResponse $ A.encode unit -- how to send json back. 
+1

이것이 올바른 해결책입니다. Happstack.Server.RqData의 코드는 url-encoded 및 multiple/form-data 제출을 처리합니다. 원시 요청 본문 만 필요하면 takeRequestBody로 가져옵니다. 언젠가는 충돌 과정에 AJAX/JSON 섹션이있을 것입니다. – stepcut

+0

@Sean Clark,이 코드에서 <- 광범위하게 사용됩니다. 그것은 할당 문 (또는)보다 더 그것 ?? 'body <- getBody'와 같이. getBody의 반환 값은 본체 변수 –

+0

에 주어집니다. @MadhavanKumar 그 이상입니다. haskell 모나드 및 do-notation 참조 – Bladt