С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для skuns
2 / 2 / 2
Регистрация: 28.12.2014
Сообщений: 44

Кросс-доменный XMLHttpRequest запрос

06.12.2016, 19:40. Показов 3077. Ответов 7

Студворк — интернет-сервис помощи студентам
После GET запроса, Не удаётся прочесть ответ сервера, т.к. сервер не добавляет заголовок "Access-Control-Allow-Origin" в ответ.
Запрос делается для тестового Redux приложения по отображению курса валют.

Запрос:
JavaScript
1
2
3
4
5
6
7
8
9
10
    var xhr = new XMLHttpRequest();
    const params = 'date_req=' + encodeURIComponent('06/12/2016')
    xhr.open('GET', 'http://www.cbr.ru/scripts/XML_daily.asp?' + params, true);
    xhr.send();
 
    if (xhr.status != 200) {
      console.log( xhr.status + ': ' + xhr.statusText );
    } else {
      console.log(xhr.responseText)
    }
Ошибка из консоли:

XMLHttpRequest cannot load http://www.cbr.ru/scripts/XML_... F03%2F2016. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

Заголовки:

Request URL:http://www.cbr.ru/scripts/XML_... F03%2F2016
Request Method:GET
Status Code:200 OK
Remote Address:212.40.192.49:80


Загоровки запроса:

GET /scripts/XML_daily.asp?date_req=02%2F03%2F2016 HTTP/1.1
Host: www.cbr.ru
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: */*
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2


Заголовки ответа:

Cache-Control: private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/xml
Date:Tue, 06 Dec 2016 15:26:50 GMT
Server:nginx/1.11.5
Transfer-Encoding:chunked
X-Powered-By:ASP.NET


Код сервера тестового приложения:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var webpack = require('webpack')
var webpackDevMiddleware = require('webpack-dev-middleware')
var webpackHotMiddleware = require('webpack-hot-middleware')
var config = require('./webpack.config')
 
var app = new (require('express'))()
var port = 3000
 
var compiler = webpack(config)
app.use(webpackDevMiddleware(compiler, { noInfo: true, publicPath: config.output.publicPath }))
app.use(webpackHotMiddleware(compiler))
 
app.get("/", function(req, res) {
  res.sendFile(__dirname + '/index.html')
})
 
app.listen(port, function(error) {
  if (error) {
    console.error(error)
  } else {
    console.info("Listening on port %s. http://localhost:%s/", port, port)
  }
})
Подскажите пожалуйста способ как можно получить доступ к ответу сервера.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2016, 19:40
Ответы с готовыми решениями:

Кросс-доменный get запрос
Добрый вечер. Для создания кросс-доменного запроса необходимо установить header Access-Control-Allow-Origin: *. Как это сделать средствами...

Кросс-доменный запрос на js и php
Всем доброго времени суток, делаю кросс-доменный post запрос, но столкнулся с небольшой проблемой при передаче/приеме данных. Есть код...

XMLHttpRequest не отправляет запрос
Всем привет. Есть у меня простая задачка, с помощью VK api вытащить инфу о пользователе и отобразить на странице. Пытаюсь отправлять...

7
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
06.12.2016, 20:26
skuns, ну правильно, вы пытаетесь со своего сервера (я так понимаю node.js) сделать запрос на "левый" сайт, а он не должен вам отвечать, тк подобные операции, в целях безопасности, запрещены. Вы можете делать Ajax на свой localhost:3000 и всё. В данном случае можно XML прогрузить в iframe и запарсить
например так или
JavaScript
1
jQuery.parseXML()
0
 Аватар для skuns
2 / 2 / 2
Регистрация: 28.12.2014
Сообщений: 44
06.12.2016, 20:36  [ТС]
SergioO, а что скажите по поводу JSONP? Мне хорошие люди советовали...
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
06.12.2016, 22:20
Цитата Сообщение от skuns Посмотреть сообщение
SergioO, а что скажите по поводу JSONP? Мне хорошие люди советовали...
jsonp позволяет делать необходимые вам запросы, но я с ним не работал и поэтому не могу утверждать подойдет ли это в данном случае - попробуйте.
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
06.12.2016, 22:35
Цитата Сообщение от SergioO Посмотреть сообщение
подойдет ли это
Не подойдёт, т.к. сервер возвращает XML.
0
 Аватар для skuns
2 / 2 / 2
Регистрация: 28.12.2014
Сообщений: 44
07.12.2016, 16:07  [ТС]
Спасибо за совет SergioO, с помощью iframe удалось произвести запрос, правда добрать до инфы пока не знаю как, хоть уже вижу её:

Скрин:

Код писал согласно этой статье.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
var url = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=07/12/2016';
 
function createIframe(name, src, debug) {
  src = src || 'javascript:false';
 
  var tmpElem = document.createElement('div');
 
  tmpElem.innerHTML = '<iframe name="' + name + '" id="' + name + '" src="' + src + '">';
  var iframe = tmpElem.firstChild;
 
  if (!debug) {
    iframe.style.display = 'none';
  }
 
  document.body.appendChild(iframe);
 
  return iframe;
}
 
 
var CallbackRegistry = {}; // реестр
 
function iframeGet(url, onSuccess, onError) {
 
  var iframeOk = false; // флаг успешного ответа сервера
 
  var iframeName = Math.random(); // случайное имя для ифрейма
  var iframe = createIframe(iframeName, url);
 
  CallbackRegistry[iframeName] = function(data) {
    iframeOk = true;
    onSuccess(data);
  }
 
  iframe.onload = function() {
    iframe.parentNode.removeChild(iframe);
    delete CallbackRegistry[iframeName];
    if (!iframeOk) onError(); // если сервер не ответил как надо - что-то не так
  }
 
}
 
function ok(result) {
  console.log('result: ' + result);
}
 
function fail() {
  console.log('fail');
}
Причина - сервер не вызывает из основного окна функцию обработки, если опираться на статью Кантора. То есть псевдокод от сервера приходит не такой:
JavaScript
1
2
3
<script>
  parent.CallbackRegistry[window.name]({данные});
</script>
Как иначе можно добраться до инфы?
0
 Аватар для skuns
2 / 2 / 2
Регистрация: 28.12.2014
Сообщений: 44
07.12.2016, 19:35  [ТС]
Решение нашёл - чтобы делать кросс-доменные запросы с Chrome, нужно написать для него расширение!
В параметрах расширения указать разрешенные для запросов домены.
Универсальных способов нет. Для других браузеров свои костыли.
Почитать про весь этот ахтунг можно тут:
https://habrahabr.ru/post/130436/.

Сводная картинка способов решений:

Гайд по написанию расширения тут:
https://habrahabr.ru/post/130436/
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
08.12.2016, 01:47
на php
PHP
1
2
$xml = simplexml_load_file('http://www.cbr.ru/scripts/XML_daily.asp?date_req=07/12/2016');
printf('<pre>%s</pre>', print_r($xml, true));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2016, 01:47
Помогаю со студенческими работами здесь

Не могу сделать запрос XMLHttpRequest (POST)
Подскажите рабочий пример POST запроса, ничего не нашел, другие примеры пробовал - они не работают, запрос просто не проходил...

XmlHttpRequest запрос (отправка данных на label и ответ с сайта)
Имеется блокнот с неким словом на русском языке, к примеру, словом &quot;мама&quot;. Нужно отправить это слово на сайт sozdik.kz(русско-казахский...

Кросс-доменный запрос
Добрый день. Написал такой код var xhr = new XMLHttpRequest(); xhr.open(&quot;GET&quot;, 'https://wi.ua', true); xhr.onreadystatechange...

XMLHttpRequest запрос
Ситуация следующая. Есть сервер VPS, на котором стоит приложение Node.js. К нему необходимо сделать запрос от &quot;клиента&quot;...

Сделать XMLHttpRequest запрос на http
Всем привет. Ситуация такая: Есть один сайт А с которого делает XMLHttpRequest запрос на сайт В у которого есть только http, а https нет....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru