2011-11-18 7 views
7

Voglio produrre il risultato decodificato per i dati POST. Gran parte del codice viene "sprecata" nella conversione di "string". Questo rende il codice brutto. Qualche soluzione migliore?Come evitare la conversione tra diversi tipi di 'stringhe' in haskell, usando 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 

Quale sarebbe il codice per questo scopo?

+1

Forse aggiungere la mia funzione 'fromMaybeW8sToLBS = LBS.pack. map (fromMaybe 0) ' – wenlong

+0

Perché è necessario decodificare autonomamente il corpo della richiesta? Sei sicuro che Snap non lo fa per te? – nponeccop

+0

@nponeccop, corpo della richiesta ha tipo ByteString, voglio considerarlo come stringa codificata url e decodificarlo. Ma decodificare '(decodificare url) vuole String e restituisce [Forse Word8]. – wenlong

risposta

8

Snap decodifica automaticamente la richiesta e la rende disponibile attraverso il tipo di dati Request. Fornisce le funzioni getRequest e withRequest per il recupero della richiesta e una serie di altre funzioni di accesso per ottenere varie parti.

Ci sono anche funzioni di convenienza per le operazioni comuni. Per ottenere un parametro POST o GET, vedere getParam.

Snap dà a voi come un ByteString perché questa API si siede ad una piuttosto basso livello di astrazione, lasciando al all'utente come gestire le cose come codifica del testo. Ti consigliamo di utilizzare il tipo di testo più efficiente invece di String. La classe di tipo Readable fornisce anche un meccanismo per l'eliminazione di parte della piastra di queste conversioni. Le istanze predefinite per i numeri e il testo presuppongono la codifica UTF8.

+0

Seguo il suggerimento per utilizzare Data.Text insieme a {- # LANGUAGE OverloadedStrings # -} se non lo si è già. Potresti anche scoprire che devi "importare DataString (IsString)" per alcune conversioni, ma Snap lo rende piuttosto semplice. – clintm

+0

Se utilizzo il tipo Testo, ho bisogno di una conversione aggiuntiva per applicare alcune funzioni che accettano il tipo String, Codec.Binary.Url.decode 'in questo caso. – wenlong

+1

La funzione daBS fornita dalla classe di tipo Leggibile esegue anche questa. – mightybyte

Problemi correlati