Тестовый запрос в 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? |
Цитата:
А вот заголовок application/json для пустого тела запроса как бы и без надобности. |
Вложений: 3
Сегодня узнал вот что. Отправка этого запроса в Postman'е возможна только при наличии 2-х заголовков:
1) Content-Length = 0 2) Host = ... Про Host написано, что он нужен для идентификации имени домена, для которого запрос отправляется на сервер. Спрашивается: какого домена? Я попробовал указать домен сайта, с которого запускается этот скрипт, - безрезультатно. |
Цитата:
PS. Глянул кратко я API, во-первых там куча требований к сайтам, а во-вторых авторизация не в xmlhttp.open, а Basic в заголовках (хотя оно то и служит для этого). Вот так попробуйте:
xmlhttp.open("POST", "https://api.cloudpayments.ru/test");
xmlhttp.setRequestHeader('Authorization', 'Basic ' + закодированная в base64 строка Public_ID:Пароль);
|
Цитата:
Кстати, если написать обработчик события "onerror", то оно срабатывает. xmlhttp.onerror = function() { alert('Запрос не удался.'); }; Как можно узнать, в чем ошибка? xmlhttp.response возвращает пустую строку. |
xmlhttp.onerror = function(e) {
alert(e.target.status);
};
|
надо смотреть в консоль разработчика, например в хроме, 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, либо надо на стороне своего сервера (что и делает постман) выполнять запрос на чужой сервер и потом его оправлять клиенту свой запрос -> свой сервер делает запрос -> на чужой сервер -> получаешь ответ... |
Цитата:
Цитата:
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". Как говорится, дурдом - он и в Африке дурдом. ) А сейчас - АНТРАКТ! )) |
И снова здравствуйте!
Осталась непонятной вот какая вещь. Если в браузере я введу: 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]; |
| Часовой пояс GMT +3, время: 04:40. |