2011-11-18 12 views
7

Quiero producir el resultado decodificado para datos POST. Gran parte del código se 'desperdicia' al convertir 'cadena'. Eso hace que el código sea feo. ¿Alguna mejor solución?¿Cómo evitar la conversión entre diferentes tipos de 'cadenas' en 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 

¿Cuál sería su código para este propósito?

+1

Quizás agregue mi propia función 'fromMaybeW8sToLBS = LBS.pack. map (fromMaybe 0) ' – wenlong

+0

¿Por qué necesita decodificar el cuerpo de la solicitud usted mismo? ¿Estás seguro de que Snap no hace eso por ti? – nponeccop

+0

@nponeccop, el cuerpo de la solicitud tiene ByteString, quiero considerarlo como una cadena codificada en url y decodificarla. Pero decodificar '(url decodificar) quiere Cadena y devuelve [Tal vez Word8]. – wenlong

Respuesta

8

Snap descodifica automáticamente la solicitud y la pone a su disposición a través del tipo de datos Request. Proporciona las funciones getRequest y withRequest para recuperar la solicitud y una serie de otras funciones de acceso para obtener varias partes.

También hay funciones de conveniencia para operaciones comunes. Para obtener un parámetro POST o GET ver getParam.

Snap se lo da a usted como ByteString porque esta API tiene un nivel de abstracción bastante bajo, dejando al usuario la forma de manejar cosas como la codificación de texto. Le recomendaría que use el tipo de texto mucho más eficiente en lugar de String. La clase de tipo Readable también proporciona un mecanismo para eliminar algunas de las repeticiones de estas conversiones. Las instancias predeterminadas para números y texto asumen la codificación UTF8.

+0

En segundo lugar sugiero utilizar Data.Text junto con {- # LANGUAGE OverloadedStrings # -} si aún no lo está. También puede encontrar que tiene que 'importar Data.String (IsString)' para algunas conversiones, pero Snap lo hace bastante sencillo. – clintm

+0

Si uso el tipo de texto, necesito una conversión adicional para aplicar algunas funciones que aceptan el tipo de cadena, Codec.Binary.Url.decode 'en este caso. – wenlong

+1

La función fromBS proporcionada por la clase de tipo Legible lo hace también. – mightybyte

Cuestiones relacionadas