1

私は、WAIのシナトラのようなラッパーであるscottyを使用しています。生のリクエスト本文をバイト文字列として取得して、jsonとして解析できるようにします。以下は近いです。これは、WAIを使用してボディを消費することに関する他の質問と似ていますが、ボディをバイト文字列として使用する必要があるため、および別のモナドであるActionMにいるため、異なります。

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

4

4 に答える 4

4

新しいバージョンのScotty(0.2.0)には、これを行うための「jsonData」メソッドがあります。ご利用いただきありがとうございます!

于 2012-02-04T23:17:30.923 に答える
2

受け入れられた答えは、動作方法が原因で実際​​には動作しませんlazyConsume。常に空のリストを返します。を使用している場合は、終了するにデータを消費する必要があります。ResourceTlazyConsume

別の方法として、バイト文字列を厳密に使用して返す方法は次のとおりです。

rawRequestBody :: Request -> IO B.ByteString
rawRequestBody req = mconcat <$> runResourceT (requestBody req $$ consume)
于 2012-12-27T07:45:53.107 に答える
1

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

ソースを使用するには、Data.Conduit.List.consume(またはData.Conduit.Lazy.lazyConsume)を使用します。ByteString結果として、のリストが表示されます。次に、ResourceTモナド変換子を終了するには、を使用しますrunResourceT。結果のコード:

bss <- liftIO . runResourceT . lazyConsume . requestBody $ r
bss :: [ByteString]
于 2012-01-28T03:12:55.690 に答える
0

これは、jhicknerの

rawRequestBody req = mconcat <$> (requestBody req $$ consume)
于 2014-04-21T20:29:37.340 に答える