14

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

しかし、これはコンテンツ タイプが原因で失敗します。これを行う別の機能はありますか?

4

3 に答える 3

17

他の回答はかなり古いようで、以下で使用される関数が追加される前からのものです。

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)
于 2015-08-11T02:30:39.847 に答える
8

これが今それを行う方法です。将来のリリースでは、いくつかの便利なラッパーを追加したいと考えています。これに関する意見を歓迎します。

説明: 各ハンドラー関数はGGHandler sub master (Iteratee ByteString IO)モナドに存在します。これはかなり複雑ですが、これが意味することは、ByteString のストリームを受け取る Iteratee の周りの Handler モナド トランスフォーマーであるということです。その ByteStrings のストリームは、生のリクエスト ボディです。

したがって、列挙子の消費関数を使用して、ByteString のストリーム全体を取得し、それらをリストとして格納する必要があります。そして、lift 関数を使用して、これを内部モナド (Iteratee) に持ち上げる必要があります。次に、L.fromChunks は厳密な ByteString のリストから遅延 ByteString に変換します。これは、任意の JSON ライブラリで解析できます (Yesod は aeson で標準化されています)。

私の推測では、私が提供できる最も便利な関数はparseRequestJson :: GGHandler s m (Iteratee ByteString IO) (Maybe Data.Aeson.Value). yesod-json のポイント リリースでそれを追加できます。

于 2011-04-24T03:52:24.643 に答える
3

Yesod 1.0以降(およびそれ以前の場合は不明)では、以下が機能しているように見えます。

postRootR = do
    wr <- waiRequest
    bss <- lift $ lazyConsume $ requestBody wr
    let requestBody = L.fromChunks bss
于 2012-04-15T20:32:47.207 に答える