Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.06.2020, 13:36
Новичок на форуме
Отправить личное сообщение для GSV4 Посмотреть профиль Найти все сообщения от GSV4
 
Регистрация: 29.06.2020
Сообщений: 5

Тестовый запрос в CloudKassir
В онлайн-кассе CloudKassir есть возможность работы через API. В документации (https://developers.cloudkassir.ru/#testovyy-metod) описан тестовый запрос. Выполняю его в Postman'е - всё работает. А на JavaScript не получается: свойство status = 0, и не понятно, как получить ответ в формате JSON. Свойство responseText не работает. Техподдержка CloudKassir в JavaScript'е не разбирается.

Код такой:
var xmlhttp = CreateXmlHttp();
  PostRequest();

  function PostRequest()
  {
    xmlhttp.open("POST", "https://api.cloudpayments.ru/test", true, "<Public ID>", "<Пароль>");
    xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
    xmlhttp.responseType = "json";

    xmlhttp.addEventListener(
      "readystatechange",
      () =>
      {
        if (xmlhttp.readyState != 4) return;

        alert(
          'readyState = ' + xmlhttp.readyState +
          '; status = ' + xmlhttp.status +
          '; statusText = [' + xmlhttp.statusText + ']'
        );
      }
    );

    xmlhttp.send("");
  }

  function CreateXmlHttp()
    // Данная функция создаёт кроссбраузерный объект XMLHTTP.
  {
    var xmlhttp;

    try
    {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      try
      {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (E)
      {
        xmlhttp = false;
      }
    }

    if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
    {
      xmlhttp = new XMLHttpRequest();
    }

    return xmlhttp;
  }


Кто-нибудь в курсе, как получить ответ от сервера в формате JSON?
Ответить с цитированием
  #2 (permalink)  
Старый 29.06.2020, 16:02
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от GSV4
как получить ответ от сервера в формате JSON?
xmlhttp.response, это будет объект (если будет ответ), так как определен ожидаемый тип xmlhttp.responseType = "json";

А вот заголовок application/json для пустого тела запроса как бы и без надобности.
Ответить с цитированием
  #3 (permalink)  
Старый 30.06.2020, 09:33
Новичок на форуме
Отправить личное сообщение для GSV4 Посмотреть профиль Найти все сообщения от GSV4
 
Регистрация: 29.06.2020
Сообщений: 5

Сегодня узнал вот что. Отправка этого запроса в Postman'е возможна только при наличии 2-х заголовков:
1) Content-Length = 0
2) Host = ...
Про Host написано, что он нужен для идентификации имени домена, для которого запрос отправляется на сервер.
Спрашивается: какого домена?
Я попробовал указать домен сайта, с которого запускается этот скрипт, - безрезультатно.
Изображения:
Тип файла: jpg 2_01 Без заголовка Host.jpg (18.7 Кб, 2 просмотров)
Тип файла: jpg 2_02 С заголовком Host.jpg (16.7 Кб, 3 просмотров)
Тип файла: jpg 2_03 Описание заголовка Host.jpg (15.9 Кб, 3 просмотров)
Ответить с цитированием
  #4 (permalink)  
Старый 30.06.2020, 10:26
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от GSV4
Про Host написано, что он нужен для идентификации имени домена, для которого запрос отправляется на сервер.
Спрашивается: какого домена?
Все верно, свой указывать надо. Не знаю, что такое CloudKassir, судя по названию облачный сервис, а его API клиентское или ?

PS. Глянул кратко я API, во-первых там куча требований к сайтам, а во-вторых авторизация не в xmlhttp.open, а Basic в заголовках (хотя оно то и служит для этого).

Вот так попробуйте:

xmlhttp.open("POST", "https://api.cloudpayments.ru/test");
xmlhttp.setRequestHeader('Authorization', 'Basic ' + закодированная в base64 строка Public_ID:Пароль);

Последний раз редактировалось laimas, 30.06.2020 в 10:59.
Ответить с цитированием
  #5 (permalink)  
Старый 02.07.2020, 11:51
Новичок на форуме
Отправить личное сообщение для GSV4 Посмотреть профиль Найти все сообщения от GSV4
 
Регистрация: 29.06.2020
Сообщений: 5

Сообщение от laimas
Вот так попробуйте:

xmlhttp.open("POST", "https://api.cloudpayments.ru/test");
xmlhttp.setRequestHeader('Authorization', 'Basic ' + закодированная в base64 строка Public_ID:Пароль);
Попробовал. То же самое.

Кстати, если написать обработчик события "onerror", то оно срабатывает.

xmlhttp.onerror = function() {
alert('Запрос не удался.');
};

Как можно узнать, в чем ошибка?
xmlhttp.response возвращает пустую строку.
Ответить с цитированием
  #6 (permalink)  
Старый 02.07.2020, 12:03
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

xmlhttp.onerror = function(e) {
    alert(e.target.status);
};
Ответить с цитированием
  #7 (permalink)  
Старый 02.07.2020, 12:10
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

надо смотреть в консоль разработчика, например в хроме, https://developers.google.com/web/tools/chrome-devtools, там в разделе Network (Сеть), можно посмотреть отправленные запросы и полученные на них ответы...

скорее всего там будет на запорос:
fetch('https://api.cloudpayments.ru/test').then(r => r.json).then(r => console.log(r))

будет ответ:
Access to fetch at 'https://api.cloudpayments.ru/test' from origin 'http://localhost:5000' has been blocked by CORS policy: 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.

в хроме нельзя отправить запрос на другой домен, если этот домен не разрешил принимать запросы от других доменов

что будет значить что либо чужой сервер должен проставить твой сайт в хидер Access-Control-Allow-Origin, либо надо на стороне своего сервера (что и делает постман) выполнять запрос на чужой сервер и потом его оправлять клиенту

свой запрос -> свой сервер делает запрос -> на чужой сервер -> получаешь ответ...
Ответить с цитированием
  #8 (permalink)  
Старый 02.07.2020, 14:26
Новичок на форуме
Отправить личное сообщение для GSV4 Посмотреть профиль Найти все сообщения от GSV4
 
Регистрация: 29.06.2020
Сообщений: 5

Сообщение от laimas
xmlhttp.onerror = function(e) {
    alert(e.target.status);
};
Вышел "0", что не внесло особой ясности. )

Сообщение от Vlasenko Fedor
F12 -> вкладка сеть, найти этот запрос и посмотреть ответ
На вкладке "Network" ничего не было. А вот на вкладке "Console" было вот что:

Unchecked runtime.lastError: The message port closed before a response was received.
(index):826 Refused to set unsafe header "Content-Length"
Test_PostRequest @ (index):826
(index):1 Access to XMLHttpRequest at 'https://api.cloudpayments.ru/test' from origin '<Наш сайт>' 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.
api.cloudpayments.ru/test:1 Failed to load resource: net::ERR_FAILED

Что тоже не особо понятно.

Сообщение от SuperZen
надо смотреть в консоль разработчика, например в хроме, https://developers.google.com/web/tools/chrome-devtools, там в разделе Network (Сеть), можно посмотреть отправленные запросы и полученные на них ответы...
Там вообще ничего не понятно. Одни инструкции какие-то и никакой информации по моему запросу.

Но зато я сам понял, в чем была проблема. (Как говорил М.Задорнов, "Готовы? Готовы? Наберите воздуха в легкие!")
После того как я вместо адреса "https://api.cloudpayments.ru/test" указал просто "api.cloudpayments.ru/test" всё пошло-поехало: и status = 200, и statusText = "OK".
Как говорится, дурдом - он и в Африке дурдом. )

А сейчас - АНТРАКТ! ))
Ответить с цитированием
  #9 (permalink)  
Старый 06.07.2020, 08:40
Новичок на форуме
Отправить личное сообщение для GSV4 Посмотреть профиль Найти все сообщения от GSV4
 
Регистрация: 29.06.2020
Сообщений: 5

И снова здравствуйте!
Осталась непонятной вот какая вещь.
Если в браузере я введу:
https://<Public ID>:<Пароль>@api.cloudpayments.ru/test

То выходит следующее:
{"Success":true,"Message":"bd6353c3-0ed6-4a65-946f-083664bf8dbd"}

Вопрос: как программно получить эти "Success" и "Message"?

Если я пишу так:
var xmlhttp = new XMLHttpRequest();

  function PostRequest()
  {
    xmlhttp.open("POST", "api.cloudpayments.ru/test", true);
    xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
    xmlhttp.setRequestHeader('Authorization', 'Basic <Public ID:Пароль>');

    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState != 4) return;

      console.log(
        'readyState = '  + xmlhttp.readyState + '; ' +
        'status = '      + xmlhttp.status     + '; ' +
        'statusText = [' + xmlhttp.statusText + ']; ' +
        'response = ['   + xmlhttp.response   + ']; '
      );
    };

    xmlhttp.onerror = function(e) {
      alert(e.target.status);
    };

    xmlhttp.send();
  }

то в консоли выходит вот что:
readyState = 4; status = 200; statusText = [OK]; response = [<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0"><script>window.plp = {"page_id":2566432,"content_id":3660355,"lang":"ru","time":1594013128,"screens":"screens-xs-sm-lg","animations":{"section":{"type":"scroll"},"widget":{"type":"scroll"}}};window.plp_page_id = 2566432;window.plp_content_id = 3660355;window.plp_lang = "ru";window.lptag = "5764d9a6b5f0e614e83343b91213b6a1wSH3i/NAWTUih4ifMLkfIQXjMCBp/EVtRsYEfLQ14QFWarYOkubftii+QjKErCcY";window.error_handler = function (e, fn_id) {    window.console && console.log && console.log(fn_id);    
...


Если же я пишу так:
var xmlhttp = new XMLHttpRequest();

  function PostRequest()
  {
    xmlhttp.open("POST", "api.cloudpayments.ru/test", true);
    xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
    xmlhttp.setRequestHeader('Authorization', 'Basic <Public ID:Пароль>');
    xmlhttp.responseType = "json";

    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState != 4) return;

      console.log(
        'readyState = '  + xmlhttp.readyState + '; ' +
        'status = '      + xmlhttp.status     + '; ' +
        'statusText = [' + xmlhttp.statusText + ']; ' +
        'response = ['   + JSON.stringify(xmlhttp.response) + ']; '
      );
    };

    xmlhttp.onerror = function(e) {
      alert(e.target.status);
    };

    xmlhttp.send();
  }

то в консоли выходит вот это:
readyState = 4; status = 200; statusText = [OK]; response = [null];
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не отправляется 2й запрос после 1го. (XMLHttpRequest) Артист AJAX и COMET 6 05.10.2016 00:37
Как оборвать на сервере и клиенте запрос если у клиента пропала сеть. beard AJAX и COMET 3 21.12.2012 16:35
AJAX запрос в Internet Explorer срабатывает через раз nikolayseo jQuery 5 13.11.2012 00:13
Запрос на сервер Serjuk AJAX и COMET 6 04.06.2012 03:09
Запрос - ответ(VK,json) Slawaq Серверные языки и технологии 4 25.09.2010 00:28