yesod - получение тела запроса для POST "Content-type: application / json" - PullRequest
13 голосов
/ 24 апреля 2011

Используя yesod 0.8.0, я пытаюсь получить тело сообщения из этого примера запроса:

curl -v -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"name":"oscar"}'    http://localhost:3000/user/xyz

в моем обработчике я вижу только использование

(pp, files) <- runRequestBody

Но это не удается из-за типа контента. Есть ли другая функция для этого?

Ответы [ 3 ]

15 голосов
/ 11 августа 2015

Другие ответы кажутся довольно старыми и до того, как были добавлены функции, использованные ниже.

postFooR :: Handler Value
postFooR = do
 foo <- requireJsonBody :: Handler Foo -- get the json body as Foo (assumes FromJSON instance)
 returnJson foo -- return json (assumes ToJSON instance)
8 голосов
/ 24 апреля 2011

Вот как это сделать сейчас .В будущих выпусках я надеюсь добавить несколько удобных обёрток;приветствуется вклад в это.

Объяснение: Каждая функция-обработчик живет в монаде GGHandler sub master (Iteratee ByteString IO).Это довольно сложно, но это означает, что это монадный преобразователь Handler вокруг Iteratee, который получает поток ByteStrings.Этот поток ByteStrings является необработанным телом запроса.

Так что нам нужно использовать функцию потребления перечислителя, чтобы взять весь этот поток ByteStrings и сохранить их в виде списка.И нам нужно использовать функцию lift, чтобы поднять ее во внутреннюю монаду (Iteratee).Затем L.fromChunks преобразует из списка строгих ByteStrings в ленивую ByteString, которую можно анализировать с любой произвольной библиотекой JSON (Yesod стандартизирует AESON).

Я предполагаю, что наиболее удобная функция, которую я мог бы предоставитьбудет parseRequestJson :: GGHandler s m (Iteratee ByteString IO) (Maybe Data.Aeson.Value).Я могу добавить это в точечной версии yesod-json.

3 голосов
/ 16 апреля 2012

В Yesod 1.0+ (а может и раньше, не уверен) работает следующее:

postRootR = do
    wr <- waiRequest
    bss <- lift $ lazyConsume $ requestBody wr
    let requestBody = L.fromChunks bss
...