Как избежать конвертации между различными «строковыми» типами в haskell, используя snapframework? - PullRequest
7 голосов
/ 18 ноября 2011

Я хочу получить декодированный результат для данных POST. Большая часть кода «теряется» при преобразовании «строки». Это делает код ужасным. Есть лучшие решения?

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 Ответ

9 голосов
/ 18 ноября 2011

Snap автоматически декодирует запрос и делает его доступным через тип данных Request . Он предоставляет функции getRequest и withRequest для получения запроса и ряд других функций доступа для получения различных частей.

Есть также вспомогательные функции для обычных операций. Чтобы получить параметр POST или GET, см. getParam .

Snap предоставляет его в виде ByteString, поскольку этот API находится на довольно низком уровне абстракции, предоставляя пользователю возможность обрабатывать такие вещи, как кодирование текста. Я бы порекомендовал вам использовать гораздо более эффективный тип Text вместо String. Класс Readable также предоставляет механизм устранения некоторых из этих преобразований. Экземпляры по умолчанию для чисел и текста предполагают кодировку UTF8.

...