clj-http возвращает статус 200, но клиент cl js -http возвращает статус 0 для того же запроса - PullRequest
0 голосов
/ 15 марта 2020

Я делаю такой запрос, используя clj-http.client

(http/get "https://www.example.com/bar")

и получаю ответ со статусом 200.

Однако, когда я делаю тот же запрос с cl js -http.client примерно так:

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

Я получаю ответ со статусом 0, и в браузере он говорит, что он был заблокирован политикой cors.

Почему запрос cl js -http.client будет заблокирован политикой cors, если запрос clj-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 Ответ

1 голос
/ 15 марта 2020

Независимо от используемой библиотеки HTTP: если вы находитесь в контексте браузера, браузер имеет полный контроль над фактическим запросом HTTP и будет выполнять CORS.

Если вы звоните из не-браузера контекста, вы иметь полный контроль над обменом HTTP.

Ваш единственный вариант - убедиться, что серверная часть понимает CORS и возвращает правильные заголовки HTTP.

См. https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS для описания того, что нужно делать на стороне сервера.

Если вы используете кольцо, оборачивание ваших маршрутов с помощью wrap-cors является одной из возможностей.

Чтобы проверить маршруты CORS из clj, убедитесь, что вы отправляете HTTP-запросы с установленным заголовком Origin. Ваш кольцевой маршрут должен ответить с Access-Control-Allow-Origin, установленным на разрешенные источники. (Часто используется *, что хорошо для простого запроса)

...