Разрешение перекрестных запросов в Yesod
Мое приложение использует букмарклет, и мне нужно разрешить CORS дляMyRouteR
поэтому мой код букмарклета может использовать этот маршрут для запросов AJAX.
В моем первом проекте конфига / маршрутов я далMyRouteR
поддержка только одного метода запроса, PUT. Но оказалось (не очень), что мне нужно было бы также поддерживать метод OPTIONS, который браузеры используют для запросов предварительной проверки CORS.
Я кончил со следующим в конфиге / маршрутах:
/myroute MyRouteR PUT OPTIONS
Я надеялся, что в Template Haskell будет какой-то соответствующий механизм, который обрабатывает config / маршруты, так что добавление 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 ...
Это работает, но кажется немного не-есодическим, потому что это так шаблонно. Итак, два вопроса:
У нас есть лучшее прилагательное, чем есодик?Есть ли другой, лучший способ, чтобы маршрут поддерживал запросы из разных источников?