2011-11-18 3 views
7

POSTデータのデコード結果を生成したい。多くのコードは 'string'を変換する際に '無駄になります'。それはコードを醜いものにします。より良い解決策はありますか?snapframeworkを使用して、haskellの異なる 'string'タイプ間の変換を回避する方法はありますか?

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

私の独自の関数 'fromMaybeW8sToLBS = LBS.packを追加することもできます。 map(fromMaybe 0) ' – wenlong

+0

なぜリクエスト本体を自分でデコードする必要がありますか?あなたはSnapがそれをしないと確信していますか? – nponeccop

+0

@nponeccop、リクエストボディにByteString型があります。私はそれをURLエンコードされた文字列と見なしてデコードします。しかし、デコード '(URLデコード)ではStringが必要で、[多分Word8]を返します。 – wenlong

答えて

8

スナップは自動的にリクエストをデコードし、Requestデータタイプを通じて利用可能にします。要求を取り出すための関数getRequestwithRequestと、さまざまな部分を取得するためのその他のアクセサ関数を提供しています。

一般的な操作のための便利な機能もあります。 POSTまたはGETパラメータを取得するにはgetParamを参照してください。

Snapは、このAPIが非常に抽象度が低いため、ユーザーにテキストエンコーディングなどの処理方法を任せているため、ByteStringとして提供します。 Stringの代わりにはるかに効率的なText型を使用することをお勧めします。 Readableタイプのクラスは、これらの変換の定型文の一部を削除するためのメカニズムも提供します。数値とテキストのデフォルトインスタンスは、UTF8エンコーディングを想定しています。

+0

Data.Textを{ - #LANGUAGE OverloadedStrings# - }と一緒に使用することをお勧めします。いくつかの変換では 'Import Data.String(IsString)'を使用する必要があるかもしれませんが、Snapによってこれはかなり簡単になります。 – clintm

+0

Text型を使用する場合、この場合はString型のCodec.Binary.Url.decode 'を受け付ける関数を適用するために余分な変換が必要です。 – wenlong

+1

Readable型クラスによって提供されるfromBS関数もこれを行います。 – mightybyte

関連する問題