haskell 如何访问服务应用程序中的原始请求正文

irtuqstp  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(137)

在servant/阿威应用程序中,请求主体可以使用组合符获得,例如ReqBody '[JSON] Book。在这种情况下,主体被提取为Book类型的值。不清楚如何在不将其转换为类型的情况下访问原始请求主体。
可能需要原始请求正文来验证其签名。一个例子是在stripe webhook(即stripe.com)中,可能需要原始请求正文来进行验证。www.example.com上有一个很好的库hackage.org(stripe-hs),它可以进行此验证,但没有解释如何获得原始请求正文。
我想一种方法是通过中间件,在中间件中请求主体可以被一次性使用。还有其他方法吗?

idv4meu8

idv4meu81#

最后,我创建了一个新的数据类型data WebhookJSON,并为该数据类型创建了相应的MimeUnrender和MimeRender示例。就像对JSON类型所做的那样。我在组合子中使用了该数据类型,例如ReqBody '[WebhookJSON] ByteString。希望(我还没有测试过),这是一种访问原始请求主体的方法。

mec1mxoz

mec1mxoz2#

在7puns的自我回答中添加:

module JsonAsRawText where

import ClassyPrelude
import qualified Network.HTTP.Media               as M
import qualified Data.Text                        as TextS
import qualified Data.Text.Encoding               as TextS
import qualified Data.List.NonEmpty               as NE
import           Control.Arrow (left)
import Servant

data JsonAsRawText deriving Typeable

instance Accept JsonAsRawText where
  contentTypes _ =
    "application" M.// "json" M./: ("charset", "utf-8") NE.:|
    [ "application" M.// "json" ]

instance MimeUnrender JsonAsRawText TextS.Text where
  mimeUnrender _ = left show . TextS.decodeUtf8' . toStrict

值得注意的是,这绕过了Servant的许多奇妙的自动类型机制,只有当您绝对需要以字符串形式访问Content-Type: application/json请求的原始主体时,它才真正有用(例如,计算传入webhook的安全签名)。

相关问题