Fetch - запрос к другому сайту

Может вопрос аналогичен и есть уже другие, но я немного не разобрался. Как я слышал — fetch не может делать запросы на другие сайты или на порт. Вроде как надо указать какие-то заголовки специальные. Это так? Или если не так, то как сделать запрос к другому сайту?

var api = fetch("http://example.com:4540");

Есть собственный сайт, где нужно сделать запрос по порту.


Ответы (1 шт):

Автор решения: Август

есди кратко, то:

fetch без проблем делает запрос на другие домены, так же, как и на свои родные. только для кросс-доменных запросов есть дополнительная процедура, а именно:

  • перед запросов (допустим, POST), браузер делает предзапрос (preflight) на сервер в виде запроса с методом OPTIONS
  • в каждом запросе браузер автоматически вставляет в запрос заголовок Access-Control-Allow-Origin, в который записывает Вам домен, например: Access-Control-Allow-Origin: https://lolo.com. сервер же, в свою очередь, смотрит на этот заголовок и решает, обрабатывать ли Ваш запрос, или нет.
  • если он согласен, то отправляет ответ со статусом 200, браузер его принимает и только после этого он оправляет Вас главный запрос, который Вы указали в Вашем fetch.
  • если же сервер несогласен принимать Ваши запросы, то он отвергнет Ваш запрос и Вы получите ошибку в консоли.

собственно, более красиво и подробно здесь


UPDATE по вопросу в комментарии

если хотите указать Вашему Express серверу, чтобы он принимал любые кросс-доменные запросы, то вот одно из решений:

// это всё код middleware
app.use((req, res, next) => {
    res.append('Access-Control-Allow-Origin', '*'); // разрешает принимать запросы со всех доменов
    res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); // какие методы в запросах разрешается принимать
    next();
});
→ Ссылка