You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell Servant:如何处理无效Accept请求头或直接忽略它

解决Servant中Webhook接收端的406状态码问题

方案1:忽略Accept头检查(推荐)

既然webhook发送端只关心响应状态码,完全不需要在意Accept头,直接在服务器配置中开启忽略Accept头的选项:

import Servant.Server (defaultServerSettings, ignoreAcceptHeader)
import Network.Wai.Handler.Warp (runSettings, setPort)

main :: IO ()
main = do
  let servantSettings = defaultServerSettings { ignoreAcceptHeader = True }
      warpSettings = setPort 8080 servantSettings
  runSettings warpSettings $ serve api server

这样Servant会跳过所有Accept头的解析和匹配逻辑,不管客户端发送的Accept格式是否标准,都不会返回406状态码。

方案2:自定义匹配所有Accept的内容类型

如果需要保留响应内容类型的定义,可以自定义一个Accept实例,让它匹配任何Accept头:

import Servant.API (Accept(..))
import Data.ByteString.Char8 (pack)

data AnyAccept deriving (Eq, Show)

instance Accept AnyAccept where
  contentType _ = pack "text/plain"  -- 指定实际返回的内容类型
  parseAccept _ = Just AnyAccept  -- 接受任何格式的Accept头

然后将端点定义修改为:

type API = "webhook" :> Post '[AnyAccept] Text

这样Servant会认为客户端的任何Accept头都匹配AnyAccept类型,不会返回406。

方案3:使用无内容响应

如果不需要返回任何响应内容,直接用NoContent作为响应类型,Servant默认不会严格检查Accept头:

import Servant.API (NoContent(..))

type API = "webhook" :> Post '[()] NoContent

server :: Server API
server = pure NoContent

这种情况下,响应状态码会是204 No Content,完全满足webhook只关心状态码的需求。

内容的提问来源于stack exchange,提问作者Saurabh Nanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:40:28