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
相关产品推荐
相关产品推荐

