2012-01-14 67 views

回答

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編碼和多個/表單數據提交。如果你只需要原始請求體,那麼你只需要使用takeRequestBody。 在某個時間點,崩潰過程中會有一個AJAX/JSON部分。 – stepcut 2012-01-19 22:46:52

+0

@Sean Clark,我看到< - 在這段代碼中廣泛使用。它是一個賦值語句(或)比它更多嗎?像'body < - getBody'。 getBody的返回值賦給body變量 – 2015-02-19 00:06:33

+0

@MadhavanKumar不止於此。請參閱haskell monad和do-notation – Bladt 2016-11-21 20:56:40