2012-01-14 15 views
6

मैं हैप्स्टैक का उपयोग कर जेएसओएन रीस्ट एपीआई बनाने की कोशिश कर रहा हूं। इसे एक JSON शरीर के साथ POSTS की अनुमति देनी चाहिए। मैं यह कैसे कर सकता हूँ? Happstack के एपीआई में सभी कार्यों पैरामीटर नाम के आधार पर चीजों को देखने लगते हैं। ऐसा लगता है कि शरीर हमेशा यूआरएल-एन्कोडेड होता है।हैप्स्टैक के साथ JSON Rest API कैसे बनाएं? जेएसओएन बॉडी?

यदि हैप्स्टैक के साथ यह संभव नहीं है, तो मुझे किस ढांचे का उपयोग करना चाहिए?

उत्तर

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

यह सही समाधान है। हैप्स्टैक में कोड। सर्वर। आरकडाटा यूआरएल-एन्कोडेड और एकाधिक/फॉर्म-डेटा सबमिशन से निपटने के लिए है। अगर आपको सिर्फ कच्चे अनुरोध निकाय की ज़रूरत है, तो आप इसे ले लेंगेक्वॉस्ट बॉडी के साथ ले लें। कुछ समय पर क्रैश कोर्स में AJAX/JSON अनुभाग होगा। – stepcut

+0

@ सेन क्लार्क, मैं देखता हूं <- इस कोड में बड़े पैमाने पर उपयोग किया जाता है। क्या यह एक असाइनमेंट कथन (या) इससे अधिक है ?? जैसे, 'बॉडी <- getBody'। GetBody का रिटर्न वैल्यू बॉडी वैरिएबल –

+0

@ माधवनकुमार को दिया गया है, यह उससे भी अधिक है। हैकेल मोनैड और डू-नोटेशन देखें – Bladt

संबंधित मुद्दे