clj-http返回状态200,但cljs-http客户端针对同一请求返回状态0

时间:2020-03-15 10:03:25

标签: clojure cors clojurescript clj-http

我使用clj-http.client

发出这样的请求
(http/get "https://www.example.com/bar")

并获得状态为200的回复。

但是,当我使用cljs-http.client发出相同的请求时,

(go (let [response (<! (http/get (str "https://example.com" "/bar")))]
         (prn response)))

我收到状态为0的响应,并且在浏览器中显示该响应已被cors策略阻止。

如果没有clj-http.client请求,为什么cors策略会阻止cljs-http.client请求?

(defn response [data & [status]]
  {:status (or status 200)
   :headers {"Content-Type" "application/edn"
             "Access-Control-Allow-Headers" "Content-Type"
             "Access-Control-Allow-Origin" "*"
             "Access-Control-Request-Method" "GET"}
   :body (pr-str data)})

我用上面的函数响应包装对“ bar”路线的响应。

1 个答案:

答案 0 :(得分:1)

无论使用哪种HTTP库:如果您处于浏览器上下文中,则浏览器都可以完全控制实际的HTTP请求,并将强制执行CORS。

如果从非浏览器上下文中进行调用,则可以完全控制HTTP交换。

您唯一的选择是确保服务器端理解CORS并返回正确的HTTP标头。

有关服务器端需要做什么的描述,请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

如果使用环网,则用wrap-cors包裹路线是一种可能。

要测试来自clj的CORS路由,请确保您发送的HTTP请求的标头集为Origin。 您的环网路由应将Access-Control-Allow-Origin设置为允许的起点。 (通常使用'*',这对于简单的请求来说很好)