2011-11-18 13 views
7

मैं पोस्ट डेटा के लिए डीकोडेड परिणाम देना चाहता हूं। 'स्ट्रिंग' को परिवर्तित करने में बहुत अधिक कोड 'बर्बाद' होता है। यह कोड बदसूरत बनाता है। कोई बेहतर समाधान?स्नैपफ्रेमवर्क का उपयोग करके हैकेल में विभिन्न 'स्ट्रिंग' प्रकारों में कनवर्ट करने से कैसे बचें?

import   Codec.Binary.Url (decode') 
import qualified Data.ByteString.Lazy.Char8 as L (unpack) 
import qualified Data.ByteString.Char8 as S (unpack, pack) 
import qualified Data.ByteString.Lazy as LBS (pack) 

decodeUrlHandler :: Snap() 
decodeUrlHandler = do 
    body <- readRequestBody (maxBound :: Int64) 
    writeLBS $ LBS.pack $ map (fromMaybe 0) $ decode' $ L.unpack body 

इस उद्देश्य के लिए आपका कोड क्या होगा?

+1

हो सकता है कि मेरा खुद का फ़ंक्शन 'MaybeW8sToLBS = LBS.pack से जोड़ें। मानचित्र (मई 0 से 0) ' – wenlong

+0

आपको अनुरोध निकाय को खुद को डीकोड करने की आवश्यकता क्यों है? क्या आप सुनिश्चित हैं कि स्नैप आपके लिए ऐसा नहीं करता है? – nponeccop

+0

@nponeccop, अनुरोध निकाय ने बाइटस्ट्रिंग टाइप किया है, मैं इसे यूआरएल एन्कोडेड स्ट्रिंग के रूप में मानता हूं और इसे डीकोड करता हूं। लेकिन डीकोड '(यूआरएल डीकोड) स्ट्रिंग और रिटर्न [शायद वर्ड 8] चाहता है। – wenlong

उत्तर

8

स्नैप स्वचालित रूप से अनुरोध को डीकोड करता है और इसे Request डेटा प्रकार के माध्यम से आपके लिए उपलब्ध कराता है। यह अनुरोधों को पुनः प्राप्त करने के लिए getRequest और withRequest फ़ंक्शन प्रदान करता है और विभिन्न हिस्सों को प्राप्त करने के लिए कई अन्य एक्सेसर फ़ंक्शंस प्रदान करता है।

सामान्य संचालन के लिए सुविधाजनक कार्य भी हैं। POST या GET पैरामीटर प्राप्त करने के लिए getParam देखें।

स्नैप इसे बाइटस्ट्रिंग के रूप में देता है क्योंकि यह एपीआई काफी कम स्तर पर अमूर्तता पर बैठता है, जिससे उपयोगकर्ता को पाठ एन्कोडिंग जैसी चीज़ों को कैसे संभाला जा सकता है। मैं अनुशंसा करता हूं कि आप स्ट्रिंग के बजाय अधिक कुशल टेक्स्ट प्रकार का उपयोग करें। Readable टाइप क्लास इन रूपांतरणों के बॉयलरप्लेट को समाप्त करने के लिए एक तंत्र भी प्रदान करता है। संख्याओं और पाठ के लिए डिफ़ॉल्ट उदाहरण UTF8 एन्कोडिंग मानते हैं।

+0

यदि आप पहले से नहीं हैं तो {- # LANGUAGE ओवरलोडेडस्ट्रिंग्स # -} के साथ डेटा.Text का उपयोग करने के लिए दूसरा सुझाव। आपको यह भी पता चल सकता है कि आपको कुछ रूपांतरणों के लिए 'डेटा.स्ट्रिंग (IsString)' आयात करना होगा, लेकिन स्नैप इसे बहुत सरल बनाता है। – clintm

+0

यदि मैं टेक्स्ट प्रकार का उपयोग करता हूं, तो मुझे इस मामले में स्ट्रिंग प्रकार, Codec.Binary.Url.decode 'स्वीकार करने वाले कुछ फ़ंक्शंस को लागू करने के लिए एक अतिरिक्त रूपांतरण की आवश्यकता है। – wenlong

+1

पठनीय प्रकार की कक्षा द्वारा प्रदान किया गया सेबीएस फ़ंक्शन यह भी करता है। – mightybyte

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