【发布时间】:2023-01-30 02:55:30
【问题描述】:
我正在编写一个 webhook 端点(接收端)并且实际上无法控制请求中传入的 Accept 标头。它是这样的:
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
我试过 Post '[JSON, HTML, PlainText] Text 但它导致了 406 状态代码。
IIUC,由于*(可能应该是*/*)和q=.2(可能应该是q=0.2),Servant 无法将其解析为有效的Accept 标头
我该如何处理?现实情况是我不关心 Accept 标头,webhook 发送者也不真正关心响应主体(只有响应代码很重要)
我发现 Network.HTTP.Media.Accept.Accept 有 parseAccept :: ByteString -> Maybe a,我试过这样使用...
data IrrelevantAcceptHeader = IrrelevantAcceptHeader deriving (Show)
instance Network.HTTP.Media.Accept.Accept IrrelevantAcceptHeader where
parseAccept _ = Just IrrelevantAcceptHeader
matches _ _ = True
moreSpecificThan _ _ = False
hasExtensionParameters _ = True
instance Servant.Accept IrrelevantAcceptHeader where
contentType _ = fromString "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
instance MimeRender IrrelevantAcceptHeader Text where
mimeRender _ txt = toS txt
-- and here's how it's used:
data Routes route = Routes
{ rWebhook
:: route
:- "webhook"
:> Header' '[Required, Strict] "X-Api-Secret" Text
:> ReqBody '[JSON] Aeson.Value
:> Post '[IrrelevantAcceptHeader] Text
} deriving (Generic)
......但是所有这些杂耍并不真正奏效!
PS:这可能与Haskell Servant (client): UnsupportedContentType error due to weird Accept header有关
【问题讨论】:
-
你如何使用
IrrelevantAcceptHeader?仅仅定义类型(及其实例)几乎肯定是不够的(除非有一些 Template Haskell tomfoolery)。 -
@DanielWagner 更新了问题以指定如何使用
IrrelevantAcceptHeader,即Post '[IrrelevantAcceptHeader] Text