2011-11-18 20 views
7

Tôi muốn tạo kết quả đã giải mã cho dữ liệu POST. Nhiều mã được 'lãng phí' trong việc chuyển đổi 'chuỗi'. Điều đó làm cho mã xấu xí. Bất kỳ giải pháp tốt hơn?Làm thế nào để tránh chuyển đổi giữa các loại 'chuỗi' khác nhau trong haskell, sử dụng snapframework?

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 

Mã của bạn cho mục đích này là gì?

+1

Có thể thêm chức năng của riêng tôi 'fromMaybeW8sToLBS = LBS.pack. map (fromMaybe 0) ' – wenlong

+0

Tại sao bạn cần giải mã thân yêu cầu? Bạn có chắc chắn rằng Snap không làm điều đó cho bạn? – nponeccop

+0

@nponeccop, yêu cầu nội dung có loại ByteString, tôi muốn coi đó là chuỗi được mã hóa url và giải mã nó. Nhưng giải mã '(giải mã url) muốn String và trả về [Có thể là Word8]. – wenlong

Trả lời

8

Chụp tự động giải mã yêu cầu và cung cấp cho bạn thông qua loại dữ liệu Request. Nó cung cấp các chức năng getRequestwithRequest để truy xuất yêu cầu và một số chức năng truy cập khác để nhận các phần khác nhau.

Ngoài ra còn có các chức năng tiện lợi cho các hoạt động phổ biến. Để nhận thông số POST hoặc GET, hãy xem getParam.

Snap mang đến cho bạn như một ByteString vì API này nằm ở mức trừu tượng khá thấp, cho phép người dùng xử lý những thứ như mã hóa văn bản. Tôi khuyên bạn nên sử dụng kiểu Văn bản hiệu quả hơn thay vì String. Lớp loại Readable cũng cung cấp một cơ chế để loại bỏ một số bản mẫu của các chuyển đổi này. Các trường hợp mặc định cho các số và Văn bản giả sử mã hóa UTF8.

+0

Tôi thứ hai đề xuất sử dụng Data.Text cùng với {- # LANGUAGE OverloadedStrings # -} nếu bạn chưa có. Bạn cũng có thể thấy rằng bạn phải 'nhập dữ liệu.String (IsString)' cho một số chuyển đổi, nhưng Snap làm cho điều này khá đơn giản. – clintm

+0

Nếu tôi sử dụng kiểu Văn bản, tôi cần thêm một tập hợp để áp dụng một số hàm chấp nhận loại Chuỗi, Codec.Binary.Url.decode 'trong trường hợp này. – wenlong

+1

Chức năng fromBS được cung cấp bởi lớp Kiểu có thể đọc cũng thực hiện điều này. – mightybyte

Các vấn đề liên quan