在耶索德允许跨域请求(Allowing cross-origin requests in Yesod

2019-08-19 03:58发布

我的应用程序使用一个书签,我需要允许CORS MyRouteR所以我的书签代码可以使用这条路线的AJAX请求。

在我的配置/路由的第一稿,我给MyRouteR只有一个请求方法,PUT支持。 但事实证明,(杜),我会需要支持OPTIONS方法为好,其浏览器使用CORS预检要求。

我结束了在配置/路线如下:

/myroute MyRouteR PUT OPTIONS

我是那种希望会有在模板哈斯克尔一些相关的机械,其处理的config /路由,以便加入期权在这条路线的方法列表会自动地导致CORS支持,但没有骰子。 世界上没有结束,但它会是有意义的,感觉优雅的方式。

为了使CORS的工作,我给的路线的选项处理程序:

optionsMyRouteR :: Handler RepPlain
optionsMyRouteR = do
    addHeader "Access-Control-Allow-Origin" "*"
    addHeader "Access-Control-Allow-Methods" "PUT, OPTIONS"
    return $ RepPlain $ toContent ("" :: Text)

putMyRouteR :: Handler RepJson
putMyRouteR = do
    addHeader "Access-Control-Allow-Origin" "*"
    -- more stuff ...

这工作,但感觉略微未Yesodic,因为它是如此的样板。 于是,两个问题:

  1. 我们有比Yesodic更好的形容词?
  2. 是否有其他更好的方法让路由支持跨域请求?

Answer 1:

更新:其他人发布一些这方面的通用中间件: http://hackage.haskell.org/package/wai-cors 。


我目前工作的同样的事情,但尚未实施的解决方案,但是我想它可以通过WAI做Middleware类似于维基页面上的示例代码允许WOFF字体从其他领域(CORS)进行访问 。 这应该允许您从没有重复自己曾经写的CORS代码。

从链接的示例代码上面添加跨域访问的WOFF字体:

addCORStoWOFF :: W.Middleware
addCORStoWOFF app = fmap updateHeaders . app
  where
    updateHeaders (W.ResponseFile    status headers fp mpart) = W.ResponseFile    status (new headers) fp mpart
    updateHeaders (W.ResponseBuilder status headers builder)  = W.ResponseBuilder status (new headers) builder
    updateHeaders (W.ResponseSource  status headers src)      = W.ResponseSource  status (new headers) src
    new headers | woff      = cors : headers
                | otherwise =        headers
      where woff = lookup HT.hContentType headers == Just "application/font-woff"
            cors = ("Access-Control-Allow-Origin", "*")


文章来源: Allowing cross-origin requests in Yesod