Angular POST для Clojure Ring receiveResponse для предпечатной проверки имеет недопустимый код состояния HTTP 404

0

Я работаю над решением проблем с 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
clojure
ring

1 ответ

1
Лучший ответ

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, заботиться о них.

  • 0
    Благодарю . Можете ли вы опубликовать синтаксис, необходимый для функции (defn wrap-cors при использовании ring-cors или ring.middleware.cors? i В дополнение к функциям cors для GET и POST, мне также нужно вернуть json
  • 0
    Вместо allow-cross-origin вы бы использовали wrap-cors с соответствующими параметрами. У README обоих проектов есть короткие примеры этого. :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню