Angular POST到Clojure Ring receiveResponse for preflight具有无效的HTTP状态代码404

时间:2015-09-24 15:22:50

标签: angularjs clojure cors ring

我正在努力克服我的Angular / Clojure应用程序的cors问题,我无法使用哪种语法来避免POST和GET请求的Access-Control-Allow-Origin错误

我已将此代码添加到我的路径找到的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)))

这个Angular代码

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请求,这些请求将存在于本地主机上以供我的生产环境中的开发和外部服务器使用。

我非常感谢你能给予的帮助。

1 个答案:

答案 0 :(得分:1)

CORS要求非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-corsring.middleware.cors,以照顾他们。