Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.07.2019, 01:05
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

<XHR> нет ответа responseText
задача: получить responseText от сервера
URL-адрес запроса: https://api.livecoin.net/exchange/ticker
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function() {
	if(xhr.readyState == 4)
		console.log(xhr.responseText)
}
xhr.open("GET", "https://api.livecoin.net/exchange/ticker")
xhr.send()

URL-адрес запроса верный - браузер получает значение:
https://api.livecoin.net/exchange/ticker

при XHR-запросе из js - сервер возвращает пустую строку
состояние объекта xhr.readyState == 4

вопрос: как получить значение xhr.responseText
использую Google Chrome

этот же код для другого URL-адреса работает - responseText получает текст ответа
URL-адрес запроса: https://api.exmo.me/v1/ticker
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function() {
	if(xhr.readyState == 4)
		console.log(xhr.responseText)
}
xhr.open("GET", "https://api.exmo.me/v1/ticker")
xhr.send()

Последний раз редактировалось provigator, 04.07.2019 в 02:10.
Ответить с цитированием
  #2 (permalink)  
Старый 04.07.2019, 02:38
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

CORS
Ответить с цитированием
  #3 (permalink)  
Старый 04.07.2019, 17:13
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

задача: получить responseText от сервера
URL-адрес запроса: https://api.livecoin.net/exchange/ticker
var xhr = new XMLHttpRequest()
xhr.open("GET", "https://api.livecoin.net/exchange/ticker")
xhr.onreadystatechange = function() {
    if(xhr.readyState == 4)
        console.log(xhr.responseText)
}
xhr.send()

пробую в разных браузерах:
Edge, Google Chrome - responseText получает пустую строку

при запуске страницы в IE внизу появляется сообщение:
Internet Explorer запретил выполнение сценариев и элементов ActiveX на этой странице.
и кнопка: Разрешить заблокированное содержимое

при нажатии на кнопку скрипт срабатывает и responseText получает текст ответа от сервера

Сообщение от laimas Посмотреть сообщение
CORS
я так понял: сервер https://api.livecoin.net/exchange/ticker разрешает доступ любому домену - Access-Control-Allow-Origin: *
Для инициации Cross-origin запроса браузер клиента добавляет в HTTP запрос Origin (домен сайта, с которого происходит запрос).

вопрос: как правильно указать URL-адрес запроса
Ответить с цитированием
  #4 (permalink)  
Старый 04.07.2019, 17:27
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от provigator
я так понял: сервер https://api.livecoin.net/exchange/ticker разрешает доступ любому домену - Access-Control-Allow-Origin: *
Наоборот, нет такого разрешения, не отправляет сервер такого заголовка, хотя ответ есть от него, а не получаете вы его потому, что браузер блокирует доступ, по причине отсутствия разрешения. Посмотрите в консоли, и увидите сообщение об этом.

Так как блокирует бразер (это его политика) следовательно и решение проблемы, это "исключить" его из цепочки, заменив посредником - сервером. Это может быть чужой (прокси), но у вас же есть и свой сервер, запрашивайте его, он запросит указанный ресурс и вернет нужное.
Ответить с цитированием
  #5 (permalink)  
Старый 04.07.2019, 19:24
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

цепочка: клиент - сервер-посредник - data-сервер

клиент: браузер Google Chrome и локальный файл на жд - client.js
сервер-посредник: https://name.com/agent.js
data-сервер: https://api.livecoin.net/exchange/ticker

скрипт на клиенте:
файл client.js
var xhr = new XMLHttpRequest()
xhr.open("GET", "https://name.com/agent.js")
xhr.onreadystatechange = function() {
	if(xhr.readyState == 4)
		console.log(xhr.responseText)
}
xhr.send()

скрипт на сервере-посреднике https://name.com/agent.js
файл agent.js
var xhr = new XMLHttpRequest()
xhr.open("GET", "https://api.livecoin.net/exchange/ticker")
xhr.onreadystatechange = function() {
	if(xhr.readyState == 4)
		console.log(xhr.responseText)
}
xhr.send()

что делаю не правильно?
возможно ли сделать запрос на клиенте к agent.js на сервере-посреднике?
или надо использовать запрос к agent.php

Последний раз редактировалось provigator, 04.07.2019 в 22:57.
Ответить с цитированием
  #6 (permalink)  
Старый 05.07.2019, 03:13
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от provigator
скрипт на сервере-посреднике https://name.com/agent.js
файл agent.js
Даже если этот код и выполнится на сервере, то почему вы ожидаете, что ответ магическим способом через консоль сервера попадёт к вам?

Это на самом деле может выглядеть так...
const HTTPS = require("https");
const Express = require("express");

const app = new Express();

app.use(Express.static("./public"));

app.get("/", (request, response) => {
	response.redirect("/index.html");
});

app.get("/data.json", (request, response) => {
	response.setHeader("Content-Type", "application/json; charset=utf-8");
	response.setHeader("Access-Control-Allow-Origin", "*");
	
	const proxyRequest = HTTPS.request("https://api.livecoin.net/exchange/ticker", proxyResponse => {
		proxyResponse.pipe(response);
	});
	
	proxyRequest.on("error", () => {
		response.send("[]");
	});
	
	proxyRequest.end();
});

app.listen(3000, () => {
	console.log("Server runs at 3000 port");
});


Вы пишите, что client.js у вас локальный файл, в таком случае вы даже можете запустить этот сервер как локальный!

Запрашивая через этот сервер /data.json вы получите данные с https://api.livecoin.net/exchange/ticker

Пример скрипта клиента, в котором скачиваются эти данные и выводятся, например, только названия валют. https://originalinsignificantabstrac...lleys.repl.co/

Полный код... https://repl.it/@Malleys/OriginalIns...antAbstraction можете посмотреть в архиве

Для запуска у вас должен быть установлен node.js
  • Распакуйте архив
  • Перейдите в терминале в папку
  • выполните npm install, чтобы установить зависимости
  • выполните npm start, чтобы запустить сервер
В http://localhost:3000/data.json доступны данные, которые вы можете скачивать через xhr или fetch
Вложения:
Тип файла: zip OriginalInsignificantAbstraction.zip (1.7 Кб, 4 просмотров)

Последний раз редактировалось Malleys, 05.07.2019 в 03:28.
Ответить с цитированием
  #7 (permalink)  
Старый 07.07.2019, 00:03
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

windows 10
архив: node-v10.16.0-win-x86.zip
распаковываю в папку e:\nodejs\

в командной строке:
Код:
E:\nodejs>npm install
up to date in 0.206s
E:\nodejs>npm start
npm ERR! path E:\nodejs\package.json
npm ERR! code ENOENT
npm ERR! errno -4058
npm ERR! syscall open
npm ERR! enoent ENOENT: no such file or directory, open 'E:\nodejs\package.json'
npm ERR! enoent This is related to npm not being able to find a file.

ищу файл package.json:
e:\nodejs\node_modules\npm\package.json
копирую в e:\nodejs\

в командной строке:
Код:
E:\nodejs>npm install
npm WARN deprecated fs-access@2.0.0: This package is no longer relevant as Node.js 0.12 is unmaintained.
npm WARN deprecated coffee-script@1.12.7: CoffeeScript on NPM has moved to "coffeescript" (no hyphen)
npm WARN deprecated circular-json@0.3.3: CircularJSON is in maintenance only, flatted is its successor.
E:\nodejs\parser -> E:\nodejs\node_modules\@babel\parser\bin\babel-parser.js
E:\nodejs\acorn -> E:\nodejs\node_modules\acorn\bin\acorn
.......
.......
.......
.......

> npm@6.9.0 prepare E:\nodejs
> node bin/npm-cli.js rebuild && node bin/npm-cli.js --no-audit --no-timing prune --prefix=. --no-global && rimraf test/*/*/node_modules && make -j4 doc

internal/modules/cjs/loader.js:638
    throw err;
    ^

Error: Cannot find module 'E:\nodejs\bin\npm-cli.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:829:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! npm@6.9.0 prepare: `node bin/npm-cli.js rebuild && node bin/npm-cli.js --no-audit --no-timing prune --prefix=. --no-global && rimraf test/*/*/node_modules && make -j4 doc`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the npm@6.9.0 prepare script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

есть ошибки при установке node.js
буду искать инструкции
что посоветуете?
Ответить с цитированием
  #8 (permalink)  
Старый 07.07.2019, 09:27
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от provigator
есть ошибки при установке node.js
буду искать инструкции
что посоветуете?
Я что-то наверное запутанно написал?

Вот по порядку...


Сообщение от provigator
windows 10
архив: node-v10.16.0-win-x86.zip
распаковываю в папку e:\nodejs\
Так вы распаковали исходный код node.js, а надо было установить node.js. Установщик node.js для windows 10 https://nodejs.org/dist/v10.16.0/node-v10.16.0-x64.msi


Сообщение от provigator
ищу файл package.json:
e:\nodejs\node_modules\npm\package.json
копирую в e:\nodejs\
Зачем вы вообще что-то ищете среди исходников node.js? Архив с примером я прикрепил к сообщению!


Вот последовательность действии для запуска сервера...
  • Распакуйте архив (имелось в виду с исходным кодом сервера, который я прикрепил к сообщению https://javascript.ru/forum/attachme...bstraction-zip, вы его даже не смотрели)
  • Перейдите в терминале в папку
  • выполните npm install, чтобы установить зависимости
  • выполните npm start, чтобы запустить сервер

Последний раз редактировалось Malleys, 07.07.2019 в 09:33.
Ответить с цитированием
  #9 (permalink)  
Старый 07.07.2019, 17:10
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

устанавливаю node-v10.16.0-x64.msi
путь e:\nodejs\

распаковываю ваш архив OriginalInsignificantAbstraction.zip
путь e:\OriginalInsignificantAbstraction\
public
package.json
server.js

в терминале:
Код:
E:\OriginalInsignificantAbstraction>npm install
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN OriginalInsignificantAbstraction@1.0.0 No description
npm WARN OriginalInsignificantAbstraction@1.0.0 No repository field.

added 50 packages from 37 contributors and audited 126 packages in 3.634s
found 0 vulnerabilities


E:\OriginalInsignificantAbstraction>npm start

> OriginalInsignificantAbstraction@1.0.0 start E:\OriginalInsignificantAbstraction
> node server.js

Server runs at 3000 port

есть небольшие проблемки:
или для моей задачи это не критично?
Код:
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN OriginalInsignificantAbstraction@1.0.0 No description
npm WARN OriginalInsignificantAbstraction@1.0.0 No repository field.
Ответить с цитированием
  #10 (permalink)  
Старый 07.07.2019, 17:32
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от provigator
есть небольшие проблемки:
или для моей задачи это не критично?
Код:
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN OriginalInsignificantAbstraction@1.0.0 No description
npm WARN OriginalInsignificantAbstraction@1.0.0 No repository field.
Так это не проблемы, это предупреждение, что нет описания и репозитория в файле package.json. Вы можете работать и без них. Или можете добавить описание, если хотите. Это не влияет на работу скрипта!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
или(||) и(&&) Кирилл Margheriti Элементы интерфейса 4 28.06.2019 23:14
Обновление страницы после получения ответа от сервера potrashitel AJAX и COMET 9 24.02.2015 10:04
Разбор ответа в формате Json yv73 Общие вопросы Javascript 3 09.08.2012 05:06
Обработка ответа после POST-запроса (jQuery - Ajax) battrack jQuery 6 29.07.2012 16:06
Как узнать свернуто окно браузера или нет. bar-boss Events/DOM/Window 3 25.09.2008 16:09