我使用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”路线的响应。
无论使用哪种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
设置为允许的起点进行响应。 (通常使用“ *”,这对于简单的请求就可以了)