29.06.2020, 13:36
|
Новичок на форуме
|
|
Регистрация: 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?
|
|
29.06.2020, 16:02
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от GSV4
|
как получить ответ от сервера в формате JSON?
|
xmlhttp.response, это будет объект (если будет ответ), так как определен ожидаемый тип xmlhttp.responseType = "json";
А вот заголовок application/json для пустого тела запроса как бы и без надобности.
|
|
30.06.2020, 09:33
|
Новичок на форуме
|
|
Регистрация: 29.06.2020
Сообщений: 5
|
|
Сегодня узнал вот что. Отправка этого запроса в Postman'е возможна только при наличии 2-х заголовков:
1) Content-Length = 0
2) Host = ...
Про Host написано, что он нужен для идентификации имени домена, для которого запрос отправляется на сервер.
Спрашивается: какого домена?
Я попробовал указать домен сайта, с которого запускается этот скрипт, - безрезультатно.
|
|
30.06.2020, 10:26
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от 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.
|
|
02.07.2020, 11:51
|
Новичок на форуме
|
|
Регистрация: 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 возвращает пустую строку.
|
|
02.07.2020, 12:03
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
xmlhttp.onerror = function(e) {
alert(e.target.status);
};
|
|
02.07.2020, 12:10
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
надо смотреть в консоль разработчика, например в хроме, 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, либо надо на стороне своего сервера (что и делает постман) выполнять запрос на чужой сервер и потом его оправлять клиенту
свой запрос -> свой сервер делает запрос -> на чужой сервер -> получаешь ответ...
|
|
02.07.2020, 14:26
|
Новичок на форуме
|
|
Регистрация: 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
Что тоже не особо понятно.
Там вообще ничего не понятно. Одни инструкции какие-то и никакой информации по моему запросу.
Но зато я сам понял, в чем была проблема. (Как говорил М.Задорнов, "Готовы? Готовы? Наберите воздуха в легкие!")
После того как я вместо адреса "https://api.cloudpayments.ru/test" указал просто "api.cloudpayments.ru/test" всё пошло-поехало: и status = 200, и statusText = "OK".
Как говорится, дурдом - он и в Африке дурдом. )
А сейчас - АНТРАКТ! ))
|
|
06.07.2020, 08:40
|
Новичок на форуме
|
|
Регистрация: 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];
|
|
|
|