Хаскелл Спок: Как получить необработанное тело запроса

Функция body в Web.Spock.Action должна возвращать необработанное тело запроса. Тем не менее, похоже, что это не так:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Text.Encoding (decodeUtf8)
import Debug.Trace        (trace)
import Web.Spock
import Web.Spock.Config

app :: SpockM () () () ()
app = do
    get root $ text "Hello!"
    post "test" $ do
        b <- body       -- b is always ""!
        text $ trace ("b="++show b) decodeUtf8 b

main :: IO ()
main = do
       spockCfg <- defaultSpockCfg () PCNoDatabase ()
       runSpock 3000 (spock spockCfg app)

curl --data 123123 localhost:3000/test ничего не возвращает, а trace вывод подтверждает, что b пустая строка

Spock is running on port 3000
b=""

Эквивалентное приложение Scotty работает просто отлично:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Text.Lazy.Encoding (decodeUtf8)
import Web.Scotty

main = scotty 3000 $ do
    get "/" $ text "Hello!"
    post "/test" $  do
        b <- body       -- works fine
        text $ decodeUtf8 b

Я абсолютно не вижу, что я делаю неправильно. Любой вклад будет высоко оценен!

Обновление: приведенный выше пример будет работать с Spock >= 0.12.0.0!

0 ответов

Другие вопросы по тегам