Проблема CORS, API Yahoo Finance

  • Автор темы Oyofwfkuqm
  • Обновлено
  • 16, May 2024
  • #1
Привет, ребята,

Я собираюсь протестировать API Yahoo Finance дома! (Да, я делаю это дома!)

Я скопировал этот скрипт из RapidAPI и добавил прокси-сервер cors-anywhere-. Однако это не работает.

Эксперт Yahoo сказал, цитирую: «Я предлагаю вам обернуть это в свою конечную точку и вызвать конечную точку позже». Какова конечная точка?

Бесконечно благодарен!

 <script>
 const data = null;

 const xhr = new XMLHttpRequest();
 xhr.withCredentials = true;

 xhr.addEventListener("readystatechange", function () {
 if (this.readyState === this.DONE) {
 console.log(this.responseText);
 }
 });

 let url = "[URL='https://lumtu.com/yti/V9449VVNodHRwczovL3JhcGlkYXBpLnAucmFwaWRhcGkuY29tL3N0b2NrL3YyL2dldC1jaGFydD9pbnRlcnZhbD01bSZzeW1ib2w9R0JQRVVSJnJhbmdlPTFtbyZyZWdpb2pdW']https://rapidapi.p.rapidapi.com/stock/v2/get-chart?interval=5m&symbol=GBPEUR&range=1mo&region=US[/URL]";

 const proxy = encodeURI("[URL='https://lumtu.com/yti/bvNNvbS9odHRwczovL2NvcnMtYW55d2hlcmUuaGVyb2t1YXBwLmwBX']https://cors-anywhere.herokuapp.com/[/URL]");

 xhr.open(
 "GET",proxy+url,true

 );
 xhr.setRequestHeader(
 "x-rapidapi-key",
 "3bd27a6483mshfb828731a7d4629p1e345fjsn59f338bdbd1f"
 );
 xhr.setRequestHeader(
 "x-rapidapi-host",
 "apidojo-yahoo-finance-v1.p.rapidapi.com"
 );

 xhr.send(data);
</script>
Код (JavaScript):

Oyofwfkuqm


Рег
19 Oct, 2012

Тем
72

Постов
176

Баллов
566
  • 01, Jun 2024
  • #2
YahooFinane от RapidAPI, справа:

доступ к API через JS должен быть возможен следующим образом:

JS (выбрать):

 const data = null;

const xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
 if (this.readyState === this.DONE) {
 console.log(this.responseText);
 }
});

xhr.open("GET", "[URL='https://lumtu.com/yti/VQPPQVVNodHRwczovL2FwaWRvam8teWFob28tZmluYW5jZS12MS5wLnJhcGlkYXBpLmNvbS9hdXRvLWNvbXBsZXRlP3E9dGVzbGEmcmVnaW9uWan']https://apidojo-yahoo-finance-v1.p.rapidapi.com/auto-complete?q=tesla&region=US[/URL]");
xhr.setRequestHeader("x-rapidapi-key", "1234");
xhr.setRequestHeader("x-rapidapi-host", "apidojo-yahoo-finance-v1.p.rapidapi.com");

xhr.send(data);


Код (JavaScript): jQuery:

 const settings = { "async": true, "crossDomain": true, "url": "[URL='https://lumtu.com/yti/VQPPQVVNodHRwczovL2FwaWRvam8teWFob28tZmluYW5jZS12MS5wLnJhcGlkYXBpLmNvbS9hdXRvLWNvbXBsZXRlP3E9dGVzbGEmcmVnaW9uWan']https://apidojo-yahoo-finance-v1.p.rapidapi.com/auto-complete?q=tesla&region=US[/URL]", "method": "GET", "headers": { "x-rapidapi-key": "1234", "x-rapidapi-host": "apidojo-yahoo-finance-v1.p.rapidapi.com" } }; $.ajax(settings).done(function (response) { console.log(response); });


Код (JavaScript): xhr:

 fetch("[URL='https://lumtu.com/yti/VQPPQVVNodHRwczovL2FwaWRvam8teWFob28tZmluYW5jZS12MS5wLnJhcGlkYXBpLmNvbS9hdXRvLWNvbXBsZXRlP3E9dGVzbGEmcmVnaW9uWan']https://apidojo-yahoo-finance-v1.p.rapidapi.com/auto-complete?q=tesla&region=US[/URL]", { "method": "GET", "headers": { "x-rapidapi-key": "1234", "x-rapidapi-host": "apidojo-yahoo-finance-v1.p.rapidapi.com" } }) .then(response => { console.log(response); }) .catch(err => { console.error(err); });


Код (JavaScript): Зачем вообще суетиться с запросом GET?
 

Irina.LeadsUP


Рег
19 Dec, 2014

Тем
66

Постов
182

Баллов
532
  • 05, Jun 2024
  • #3
Это зависит от того, как вы хотите это реализовать.

Как часто вы будете запрашивать API?

Если это частота 1 запрос/2 минуты, то можно сделать что-то вроде этого:

Отправьте Ajax-запрос на ваш API

Ваш API отправляет HTTP-запрос в Yahoo, получает ответ и отправляет его обратно на исходный запрос Ajax.

Связь между серверами обычно происходит очень быстро.

На самом деле, многие компании Apps и Huge отправляют запросы от сервера к серверу для одного запроса.

Если вы делаете этот запрос несколько раз в минуту, рассмотрите возможность использования Websockets вместо Ajax.

У вас будет cronjob, который будет запрашивать API каждую минуту, и как только будет получен ответ, он отправит его на соединение с сокетом.

Несколько запросов Ajax в минуту могут привести к расходу данных и заряда батареи.
 

Alex211


Рег
11 Oct, 2011

Тем
65

Постов
194

Баллов
529
  • 06, Jun 2024
  • #4
Я хочу сосредоточиться на интерфейсе, сейчас я много работаю с vue.js (для одностраничных приложений). Возможно, я смогу запускать запросы AJAX каждые 2 минуты, но я так не думаю!? Давайте рассмотрим практический пример.

Я ввожу booking.com в строке состояния и нажимаю F-12. ЗАТЕМ: XHR: URL-адрес запроса: https://cdn.cookielaw.org/consent/3...b31/3ea94870-d4b1-483a-b1d2-faf1d982bb31.json

Метод запроса: ПОЛУЧИТЬ Код состояния: 200 URL-адрес запроса: https://cdn.cookielaw.org/consent/3...745995-04f8-44ca-a6ff-f90c2d275998/en-us.json

Метод запроса: ПОЛУЧИТЬ Код состояния: 200 URL-адрес запроса: https://cdn.cookielaw.org/scripttemplates/6.5.0/assets/otFlat.json

Метод запроса: ПОЛУЧИТЬ Код состояния: 200 URL-адрес запроса: https://cdn.cookielaw.org/scripttemplates/6.5.0/assets/otPcTab.json

Метод запроса: ПОЛУЧИТЬ Код состояния: 200 URL-адрес запроса: https://www.booking.com/js_tracking...jTrO3EMCnCTcq9Q5_Bsu-3c56RjcIsx-Va-YSfxE_yOqA

Метод запроса: ПОЛУЧИТЬ Код состояния: 200 ОК URL-адрес запроса:https://www.booking.com/gethandpick...al & soz=1 & lang_click=top & cdl=fr & lang_changed=1

Метод запроса: POST Код состояния: 200 ОК URL-адрес запроса: https://collector-pxikkul2rm.perimeterx.net/api/v1/collector

Метод запроса: POST Код состояния: 200 .....
Там написано 20/106 запросов.
 

Wildwater


Рег
01 Jan, 2011

Тем
67

Постов
184

Баллов
559
  • 09, Jun 2024
  • #5
Извините, я до сих пор не понимаю, как это должно работать.

Я могу получить данные для своего сервера с сервера, предоставляющего API.

Отлично! Однако, если я работаю с AJAX, я отправляю множество запросов на обновление моих данных во внешнем интерфейсе.

Поэтому я должен получить доступ к своему серверу с помощью JS. Этот сервер должен получить доступ к серверу API и обратно.

Я не могу себе представить, что это обычно реализуется вот так??
 

SoftMoney


Рег
07 Dec, 2011

Тем
66

Постов
192

Баллов
542
  • 10, Jun 2024
  • #6
Я думаю, он имеет в виду, что вам следует создать API в своем собственном домене. API должен вызывать это: пусть URL = "https://rapidapi.p.rapidapi.com/stock/v2/get-chart?interval=5m & symbol=GBPEUR & range=1mo & region=US

"; и верните вам ответ. Таким образом, у вас не возникнет проблем с CORS, если вы сделаете запрос к своему собственному домену.
 

Off4vra


Рег
01 Jan, 2011

Тем
69

Постов
181

Баллов
536
  • 10, Jun 2024
  • #7
Я никогда раньше не использовал Yahoo Finance API, но, судя по небольшому поиску в Google, похоже, что у Yahoo даже нет официального Finance API.

И API взяты из стороннего RapidAPI. Во-вторых, даже если бы они это сделали, JS API также может означать, что они ожидают, что вы будете использовать Node из серверной части, как и многие другие компании.

Никто не ожидает, что вы «анонсируете» свои ключи API в FrontEnd Javascript любому разработчику, который захочет их просмотреть. Кроме того, API, которые на самом деле позволяют интеграцию с внешним интерфейсом, обычно являются SDK и в большинстве случаев используют iframe.
 

Popsunen


Рег
15 Oct, 2012

Тем
69

Постов
183

Баллов
548
  • 12, Jun 2024
  • #8
Думаю, я примерно понял, конечно, сервер бронирования имеет то же происхождение, и они делают это cronjob на бэкэнде. Но вернемся к API Yahoo Finance.

Конечно, сервер управляет CORS. Я могу получить доступ к данным API, когда сервер Yahoo отправляет обратно что-то. например: Access-Control-Allow-Origin:* Очевидно, они этого не делают.

Но тогда почему они предлагают код JS API? для внешнего интерфейса, когда они все равно не разрешают CORS.
 

Cent345


Рег
24 Jan, 2014

Тем
74

Постов
187

Баллов
587
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно