2012-01-28 7 views
1

私はscottyを使用しています.scottyはWAIの周囲にシナトラ風のラッパーです。私はjsonとしてそれを解析することができるようにバイト文字列として生の要求ボディを取得したい。以下は近いです。これは、WAIを使用して、本体の消費に関する他の質問に似ていますが、私はバイト文字列として身体をしたいので、異なっている、と私は、別のモナドでActionMWAI(raw request body)を使用してコンジットを消費する方法

import Network.Wai (requestBody) 
import Web.Scotty (ActionM, request, text) 

bodyExample :: ActionM() 
bodyExample = do 
    r <- request 
    bss <- requestBody r -- this needs a lift or something 
    text "ok" 
    ... 

だからそれは明らかに動作しません、私は何らかのリフトや何かが必要だと思うが、何を使うべきか分からない。 liftIOは正しくなく、liftは私に奇妙なエラーを与えます。

http://hackage.haskell.org/packages/archive/scotty/0.0.1/doc/html/Web-Scotty.html

http://hackage.haskell.org/packages/archive/wai/latest/doc/html/Network-Wai.html

答えて

1

requestBodyモナド値ではありません。これは、単にコンジットSource IO ByteStringを返す関数です。

ソースを消費するには、Data.Conduit.List.consume(またはData.Conduit.Lazy.lazyConsume)を使用します。結果としてByteStringのリストが表示されます。 ResourceTモナドトランスを終了するには、runResourceTを使用します。結果コード:それは価値がある何のため

bss <- liftIO . runResourceT . lazyConsume . requestBody $ r 
bss :: [ByteString] 
+0

から適応、最終的には私のために働くのコードである。また、 '必要liftIO' runResourceTの直前。ありがとう! –

4

、スコッティの新バージョン(0.2.0)は、あなたのためにこれを行うには「jsonData」メソッドを持っています。ご利用ありがとうございます!

2

lazyConsumeの動作のため、受け入れられた回答は実際には機能しません。常に空のリストを返します。 lazyConsumeを使用している場合は、のデータを使用して、を終了する前にを使用する必要があります。代替案として

は、ここでは厳密にバイト文字列を消費し、それを返す方法は次のとおりです。

rawRequestBody :: Request -> IO B.ByteString 
rawRequestBody req = mconcat <$> runResourceT (requestBody req $$ consume) 
0

これはjhicknerの

rawRequestBody req = mconcat <$> (requestBody req $$ consume) 
関連する問題