【问题标题】:add a header to all responses in snap framework为 snap 框架中的所有响应添加标头
【发布时间】:2017-01-21 23:55:28
【问题描述】:

标题总结了它。我想在所有回复中添加一个标题。 我可以为我的每条路线添加一个 modifyRequest 处理程序,例如:

apiRoutes :: [(ByteString, Handler b Api ())]
apiRoutes = [("status",  addHeader)]


addHeader :: Handler b Api ()
addHeader = do
   modifyResponse (setHeader "Content-Type" "application/json")
   otherHandler

otherHandler :: Handler b Api ()
otherHandler = metod Get doActualStuff <|> metod Get doMoreActualStuff

现在,如果我有 100 条不同的路线,并且我想将标头添加到所有路线中。我必须为所有这些路由编写一个拦截器函数。如果我想更改标题,我必须修改所有 100 个拦截器函数。

有没有简单的方法?

【问题讨论】:

  • 这对我来说似乎很简短。这种方法到底有什么问题?
  • @jkeuhlen 假设我有 100 条不同的路线,我想将标头添加到所有路线中。我必须为所有这些路由编写一个拦截器函数。如果我想更改标题,我必须修改所有 100 个函数。
  • 我对snap不熟悉,但你不能定义apiRoutes = map (second (modifyResponse … *&gt;)) [("status", otherHandler)]吗?
  • @sjakobi 听起来像是一个 excelenet 的想法。我会试试看。
  • @sjakobi 我用你的提示搞定了。我有时会完全忘记 haskell 提供的工具。谢谢

标签: haskell haskell-snap-framework


【解决方案1】:

根据 sjakobi 提供的提示,我想通了。这可以像这样完成:

apiRoutes :: [(ByteString, Handler b Api ())]
apiRoutes = map (mapSecond (addHeaders >>))
[("status",  addHeader)]


addHeaders :: Handler b Api ()
addHeaders = do
   modifyResponse (setHeader "Content-Type" "application/json")
   modifyResponse (setHeader "more-header" "more-header")

mapSecond :: (b -> c) -> (a,b) -> (a,c)
mapSecond f (a,b) = (a,f b)

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2013-12-19
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多