-1

我使用 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 请求不是,为什么 cljs-http.client 请求会被 cors 策略阻止?

(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”的响应。

4

1 回答 1

1

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

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

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

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

如果您使用的是环,则将路线包裹起来wrap-cors是一种可能性。

要从 clj 测试您的 CORS 路由,请确保您发送带有Origin标头集的 HTTP 请求。您的响铃路由应Access-Control-Allow-Origin设置为允许的来源。(通常使用'*',这对于简单的请求很好)

于 2020-03-15T16:26:05.967 回答