我的应用程序使用一个书签,我需要允许CORS for MyRouteR,所以我的书签代码可以使用这个路由的
AJAX请求.
在我的第一个配置文件中,我给了MyRouteR只支持一个请求方法PUT.但事实证明(duh),我也需要支持OPTIONS方法,哪些浏览器用于CORS预检要求.
我在config / routes中结束了以下内容:
/myroute MyRouteR PUT OPTIONS
我希望在模板Haskell中会有一些相关的机制来处理配置/路由,以便将此OPTIONS添加到此路由的方法列表中会自动导致CORS支持,但没有骰子.不是世界的尽头,而是会有这样的感觉和感觉.
为了使CORS工作,我给了路由一个OPTIONS处理程序:
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有更好的形容词吗?
>还有另一个更好的方式让路由支持跨源请求吗?
更新:
还有人发表了一些通用的中间件: http://hackage.haskell.org/package/wai-cors.
还有人发表了一些通用的中间件: http://hackage.haskell.org/package/wai-cors.
我目前正在处理同样的事情,还没有实现一个解决方案,但是我想象可以通过WAI Middleware来完成,类似于wiki页面Allowing WOFF fonts to be accessed from other domains (CORS)上的示例代码.这应该允许您编写CORS代码一次而不需要重复你自己
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","*")