Я работаю над решением проблем с Cors с моим приложением Angular/Clojure, и у меня возникают проблемы с непониманием того, какой синтаксис использовать, чтобы избежать ошибки Access-Control-Allow-Origin для запросов POST и GET
Я добавил этот код в свой контроллер clojure, где обнаружены мои маршруты, и, похоже, он исправляет проблему для запросов GET:
(POST "/node/create" request
(let [node_object (or (get-in request [:params :data])
(get-in request [:body :data])
"ROUTER_ERROR")]
{:status 200
:headers {"Content-Type" "application/json"}
:body (recursiftion.model/createNode node_object)
}
))
(defn allow-cross-origin
"middleware function to allow crosss origin"
[handler]
(fn [request]
(let [response (handler request)]
(assoc-in response [:headers "Access-Control-Allow-Origin"]
"*"))))
(def app
(-> (handler/api app-routes)
(middleware/wrap-json-body {:keywords? true})
(middleware/wrap-json-response)
(allow-cross-origin)))
И этот Угловой код
this.post = function (object) {
console.log('BANG', object);
return $http({
method: "post",
url: "https://mywebserveraddress.com/node/create",
data: object
});
};
Но у меня все еще есть связанные ошибки для моих запросов POST:
preflight has invalid HTTP status code 404
Я ищу правильный синтаксис для добавления в мое приложение clojure, чтобы я мог делать запросы ajax для перекрестных доменов из моего углового спа, которые будут жить на локальном хосте для разработки и внешних серверах из моей производственной среды.
Я очень благодарен вам за помощь.
CORS требует non- запросов GET
для отправки так называемых "предполетных" запросов с использованием метода OPTIONS
. Ваш код возвращает 404, потому что они не являются обработчиками (OPTIONS "/node/create"...)
.
Лучше - но все еще очень не совсем - промежуточное ПО CORS будет иметь форму:
(def ^:private cors-headers
{"access-control-..." ...})
(defn wrap-cors
[handler]
(fn [request]
(some-> (if (= (:request-method request) :options)
{:status 200}
(handler request))
(update :headers merge cors-headers))))
Но в некоторых случаях есть еще несколько сложностей (например, *
не допустимое значение для Access-Control-Allow-Origin
), поэтому я бы рекомендовал пойти с уже существующей библиотекой, например ring-cors
ring.middleware.cors
или ring.middleware.cors
, заботиться о них.
allow-cross-origin
вы бы использовалиwrap-cors
с соответствующими параметрами. У README обоих проектов есть короткие примеры этого. :)