@dns_omsk

Curl смог, а злосчастный fetch (firefox) не может?

Транспортная компания предоставляет API. Используется HTTP Basic Authorization
Так работает:
curl --header "Content-Type: application/json" -X POST -u TOKEN: URL -d @req.json

Где "req.json":
{"date": {"from": "2024-07-01T00:00:00","to": "2024-07-08T00:00:00"}}


Но хочу сделать на javascript
create = function( d ) {
	console.log( d );
}

var options = {
	method: 'POST',
	headers: {
		'Content-Type': 'application/json',
		'Authorization': 'Basic ' + btoa( TOKEN + ':' )
	},
	body: JSON.stringify({
		date: { "from": "2024-07-01T00:00:00", "to": "2024-07-09T00:00:00" }
	})
}
fetch( url, options )
	.then( response => response.json() )
	.then( result => create( result ) )
	.catch( error => console.log(error.message) );

Ошибка:

CORS Missing Allow Origin

Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на URL. (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»). Код состояния: 404.

Отключение CORS (mode: 'no-cors') результата не дает.
WTF?
  • Вопрос задан
  • 415 просмотров
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега JavaScript
Python, JS, WordPress, SEO, Bots, Adversting
CORS API ограничивает запросы с Вашего домена (Вы же выполняете js код в браузере?). Даже если Вы укажите no-cors, то API домен все равно принимает окончательное решение.

Вам нужен любой сервер, для проксирования запроса. Выполните свой код на nodejs, и все заработает:
import fetch from 'node-fetch';
import {create} from './create.js';

const url = 'https://api.site.ru/endpoint';
const TOKEN = 'TOKEN';

const options = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Basic ${Buffer.from(`${TOKEN}:`).toString('base64')}`,
  },
  body: JSON.stringify({
    date: {
      from: '2024-07-01T00:00:00',
      to: '2024-07-09T00:00:00',
    },
  }),
};

fetch(url, options)
  .then((response) => response.json())
  .then((result) => create(result))
  .catch((error) => console.error(error.message));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
no-cors это вообще из другой оперы. Эта опция позволяет выполнить только простой запрос (HEAD, GET, POST) с ограниченным набором заголовков (Accept, Accept-Language, Content-Language, Content-Type и Range), но не даёт JS доступа к свойствам Response, то есть телу и заголовкам ответа.

Сама политика CORS контролируется браузером и не даёт делать cross-origin запросы, если сервер, к которому сделан запрос, не возвращает явного разрешения на это в заголовках ответа. Для обхода надо делать запрос через свой бэкенд, который выполняет в этом случае роль прокси для внешнего ресурса.
Ответ написан
Комментировать
@dns_omsk Автор вопроса
Установил расширение для браузера "HTTP request Maker", оно работает зараза.

668d0e5378428208022375.png
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы