Как использовать канал с WAI (необработанное тело запроса) - PullRequest
1 голос
/ 28 января 2012

Я использую Скотти, которая является синатра-подобной оберткой вокруг WAI. Я хочу получить необработанное тело запроса в виде байтовой строки, чтобы я мог разобрать его как 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 голосов
/ 05 февраля 2012

Как бы то ни было, в новой версии Scotty (0.2.0) есть метод jsonData, который сделает это за вас.Спасибо за использование!

2 голосов
/ 27 декабря 2012

Принятый ответ на самом деле не будет работать из-за способа работы lazyConsume. Он всегда будет возвращать пустой список. Вам нужно использовать данные до выхода ResourceT, если вы используете lazyConsume.

Как альтернатива, вот как строго использовать строку байта и вернуть ее:

rawRequestBody :: Request -> IO B.ByteString
rawRequestBody req = mconcat <$> runResourceT (requestBody req $$ consume)
1 голос
/ 28 января 2012

requestBody не является монадическим значением.Это просто функция, которая возвращает Conduit Source IO ByteString.

. Чтобы использовать источник, используйте Data.Conduit.List.consume (или Data.Conduit.Lazy.lazyConsume).В результате вы получите список ByteString s.Чтобы затем выйти из монадного трансформатора ResourceT, используйте runResourceT.Полученный код:

bss <- liftIO . runResourceT . lazyConsume . requestBody $ r
bss :: [ByteString]
0 голосов
/ 22 апреля 2014

Это код, который, наконец, работает для меня, адаптированный из

от jhickner
rawRequestBody req = mconcat <$> (requestBody req $$ consume)
...