LINUX.ORG.RU

Не могу сделать запрос через fetch на другой сайт

 , , , ,


0

1

Хочу использовать api kladr. Делаю:

fetch('https://kladr-api.ru/api.php?oneString=true&withParent=true&limit=10&query=%D0%BA%D0%B8%D1%80&_=1633499111351', {
    headers: {
        'Accept': '*/*',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Encoding': 'gzip, deflate, br',
        'Access-Control-Allow-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
        'Sec-Fetch-Dest': 'script',
        'Sec-Fetch-Mode': 'no-cors',
        'Sec-Fetch-Site': 'cross-site',
    }
})
    .then(response => response.json())
    .then((response) => {
        console.log(response)
    })
    .catch((e) => {
        console.log(`Ошибка: ${e}`);
    });

в консоли выдаёт Access to fetch at ‘https://kladr-api.ru/api.php?oneString=true&withParent=true&limit=10&query=%D0%BA%D0%B8%D1%80&_=1633499111351’ from origin ‘http://49.gidpokzn03.beget.tech’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.

При этом их библиотека работает. Вот какие заголовки отправляет https://i.imgur.com/n8xUINE.png

Вроде у меня те же заголовки. Как можно пофиксить? Их библиотеку не хочу, хочу свою, с блекджеком, fetch и es6


В браузерах запрещены кросс-доменные запросы. Кроме случаев когда сервер отдает заголовок типа Access-Control-Allow-Origin: * (или список доменов с которых можно).

Если сделаешь opaque request, то не сможешь в содержимое залезть. Его можно будет только юзать как кота в мешке - например воткнуть в страницу картинку, не зная что внутри (если ничего не путаю).

Так что обломись.

Vit ★★★★★ ()
Ответ на: комментарий от el-d

Без понятия, не вникал. Может она на разрешенном домене хостится, или делает серверный запрос, а не из браузера.

Мне неохота разбираться. Я написал ровно то, про что тебе вываливают ошибку, и что в этой ошибке пишут. Дальше думаю сам справишься. Но чуда не жди, ограничения CORS в браузере обойти нельзя. Только если сервер явно укажет, что к его данным может лезть кто угодно.

Vit ★★★★★ ()
Ответ на: комментарий от el-d

Ну как-то так все и поступают. Только ограничь по каким-нибудь признакам, по возможности, чтобы кулхацкеры не могли твой скрипт юзать как прокси для любых запросов.

Vit ★★★★★ ()
Ответ на: комментарий от el-d

а их библиотека почему работает?

Их библиотека (плагин для jQuery) не посылает ajax запросы. Она использует jsonp-запросы.

JSONP - это когда ты в get запросе передаешь дополнительный параметр callback, с названием функции определенной на твоем сайте. А их сервер отдает в ответ не голый json, а javascript-код - json завернутый в вызов этой функции.

То есть ответ будет не {"data":123} а fn({data: 123})

Можешь посмотреть - на свой же запрос, если откроешь по ссылке https://kladr-api.ru/api.php?oneString=true&withParent=true&limit=10&query=%D0%BA%D0%B8%D1%80&_=1633499111351&callback=yourSuperFunction

Ну и в итоге, ты просто посылаешь такие запросы не фетчем, а динамическим встраиванием <script> в свою страницу.

let src = 'https://kladr-api.ru/api.php?oneString=true&withParent=true&limit=10&query=%D0%BA%D0%B8%D1%80&_=1633499111351&callback=cb'

function cb(data){
   console.dir(data)
}

document.body.append(
    Object.assign(
       document.createElement('script'), { src }
    )
)

javascript ()
Последнее исправление: javascript (всего исправлений: 6)
Ответ на: комментарий от Vit

Его можно будет только юзать как кота в мешке - например воткнуть в страницу картинку, не зная что внутри (если ничего не путаю)

Вроде как можно использовать для кэша через Service Workers.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от Vit

Почему негодный? Стандартный всеми используемый вариант до внедрения CORS. Я не спорю, что CORS правильней и безопасней, но JSONP абсолютно рабочий вариант, называть его негодным без аргументов на мой взгляд странно.

Legioner ★★★★★ ()