6
我想用Happstack創建一個JSON REST API。它應該允許帶有JSON主體的POSTS。我怎樣才能做到這一點? happstack的API中的所有函數似乎都是基於參數名稱來查找的。它認爲身體始終是網址編碼的。如何使用Happstack創建JSON Rest API? JSON的身體?
如果Happstack不可能,我應該使用哪個框架?
我想用Happstack創建一個JSON REST API。它應該允許帶有JSON主體的POSTS。我怎樣才能做到這一點? happstack的API中的所有函數似乎都是基於參數名稱來查找的。它認爲身體始終是網址編碼的。如何使用Happstack創建JSON Rest API? JSON的身體?
如果Happstack不可能,我應該使用哪個框架?
好吧,這就是我想到的。
{-# 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.
這是正確的解決方案。 Happstack.Server.RqData中的代碼用於處理url編碼和多個/表單數據提交。如果你只需要原始請求體,那麼你只需要使用takeRequestBody。 在某個時間點,崩潰過程中會有一個AJAX/JSON部分。 – stepcut 2012-01-19 22:46:52
@Sean Clark,我看到< - 在這段代碼中廣泛使用。它是一個賦值語句(或)比它更多嗎?像'body < - getBody'。 getBody的返回值賦給body變量 – 2015-02-19 00:06:33
@MadhavanKumar不止於此。請參閱haskell monad和do-notation – Bladt 2016-11-21 20:56:40