API POST /oauth выдает ошибку Invalid object: the property 'grant_type' is missing
Пытаюсь подключиться по API но выдает ошибку {"httpCode":"400","httpMessage":"Bad Request","moreInformation":"[JSV0002] Invalid object: the property 'grant_type' is missing."}
Документация API:https://developer.sberbank.ru/api/5c9f5313e4b0388ba0f08b42
Где нужно указать grant_type и scope?
Документация API:
СтрокаURI ="https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";
СтруктураURI = СтруктураURI(СтрокаURI);
HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт,,,,,Новый ЗащищенноеСоединениеOpenSSL()); // Новый ЗащищенноеСоединениеOpenSSL() если протокол https
Заголовки = Новый Соответствие();
Заголовки.Вставить("grant_type", "client_credentials");
Заголовки.Вставить("scope", "https://api.sberbank.ru/rating/partner/legal");
Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded");
Заголовки.Вставить("Authorization","Basic client id:client secret");
Заголовки.Вставить("accept", "application/json");
Заголовки.Вставить("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");
//СтруктураДляJSON = Новый Структура;
//СтруктураДляJSON.Вставить("grant_type","client_credentials");
//СтруктураДляJSON.Вставить("scope","https://api.sberbank.ru/rating/partner/legal");
//СписокОбъектов = Новый Массив;
//СписокОбъектов.Добавить(СтруктураДляJSON);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись,);
ТелоЗапроса = Запись.Закрыть();
HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.UTF8);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтветаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();//здесь возвращается ответ запроса
Сообщить(ТекстОтветаJSON);
ПоказатьГде нужно указать grant_type и scope?
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1)Обычно ошибка 400 означает, что сервер не смог обработать запрос из-за неверного синтаксиса.
Попробуйте через такой метод, если винда. С заголовками в стандартном соединении трудности бывают.
Вот мой код. Естественно адаптируйте под себя.
Попробуйте через такой метод, если винда. С заголовками в стандартном соединении трудности бывают.
Вот мой код. Естественно адаптируйте под себя.
JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
СтрокаСоединения = Ваша строка;
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "utf-8");
WinHttp.Open("POST", СтрокаСоединения, 0);
// установка заголовков запроса
WinHttp.SetRequestHeader("Accept-Language" , "ru");
WinHttp.SetRequestHeader("Accept-Charset" , "utf-8");
WinHttp.setRequestHeader("Content-Language", "ru");
WinHttp.setRequestHeader("Content-Charset" , "utf-8");
WinHttp.setRequestHeader("Content-type" , "application/x-www-form-urlencoded; charset=utf-8");
Если НЕ СтруктураЗаголовков = Неопределено Тогда
Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
КонецЦикла;
КонецЕсли;
WinHttp.Send(ЗапросСтрока);
ТекстОтвета = WinHttp.ResponseText();
// получение JSON-данных
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
JSONДанные.ВыполненоСОшибками = Ложь;
JSONДанные.ОтветОтСервера = ПрочитатьJSON(ЧтениеJSON, Ложь);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Показать
(2)
Новый COMОбъект("WinHttp.WinHttpRequest.5.1")
[/IS-QUOTE]
Спасибо, да видимо через HTTPСоединение , с таким заголовком "Content-type" , "application/x-www-form-urlencoded; charset=utf-8" не хочет корректно работать.
Переделал как у вас в примере все работает, через Новый COMОбъект("WinHttp.WinHttpRequest.5.1") - заработало сразу.
Новый COMОбъект("WinHttp.WinHttpRequest.5.1")
[/IS-QUOTE]
Спасибо, да видимо через HTTPСоединение , с таким заголовком "Content-type" , "application/x-www-form-urlencoded; charset=utf-8" не хочет корректно работать.
Переделал как у вас в примере все работает, через Новый COMОбъект("WinHttp.WinHttpRequest.5.1") - заработало сразу.
Не читал документацию сбера. Просто по аналогии с другим сервисом, то как это работает. Возможно в сбере также.
grant_type, username, password, scope - отправляешь первым post запросом на сервер авторизации, они передаются в теле запроса. (как строка, т.е. grant_type=...&scope=..&итд)
В ответе сервера приходит токен.
И вот уже этот токен используешь дальше для своих запросов через заголовок Authorization, для api запросов к ресурсу.
grant_type, username, password, scope - отправляешь первым post запросом на сервер авторизации, они передаются в теле запроса. (как строка, т.е. grant_type=...&scope=..&итд)
В ответе сервера приходит токен.
И вот уже этот токен используешь дальше для своих запросов через заголовок Authorization, для api запросов к ресурсу.
(21)Не понимаю,что должен подставить в ЗапросСтрока
JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
СтрокаСоединения = "https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";;
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "utf-8");
WinHttp.Open("POST", СтрокаСоединения, 0);
WinHttp.SetRequestHeader("grant_type", "client_credentials");
WinHttp.SetRequestHeader("scope", "https://api.sberbank.ru/rating/partner/legal");
WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
WinHttp.SetRequestHeader("accept", "application/json");
WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");
//Если НЕ СтруктураЗаголовков = Неопределено Тогда
// Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
// WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
// КонецЦикла;
//КонецЕсли;
//WinHttp.Send(ЗапросСтрока);
WinHttp.Send();
ТекстОтвета = WinHttp.ResponseText();
// получение JSON-данных
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
JSONДанные.ВыполненоСОшибками = Ложь;
JSONДанные.ОтветОтСервера = ПрочитатьJSON(ЧтениеJSON, Ложь);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Показать
(26)
Ошибку выдает на строке
Выдает ошибку : Произошла исключительная ситуация (WinHttp.WinHttpRequest): Не удается установить соединение с сервером
JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
//СтрокаСоединения = "https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";;
СтрокаСоединения = "https://dev.api.sberbank.ru/";
ЗапросСтрока = "ru/prod/tokens/v2/oauth";
//Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "utf-8");
WinHttp.Open("POST", СтрокаСоединения, 0);
WinHttp.SetRequestHeader("grant_type", "client_credentials");
WinHttp.SetRequestHeader("scope", "https://api.sberbank.ru/rating/partner/legal");
WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
WinHttp.SetRequestHeader("accept", "application/json");
WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");
//Если НЕ СтруктураЗаголовков = Неопределено Тогда
// Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
// WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
// КонецЦикла;
//КонецЕсли;
WinHttp.Send(ЗапросСтрока);
//WinHttp.Send();
ТекстОтвета = WinHttp.ResponseText();
// получение JSON-данных
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
JSONДанные.ВыполненоСОшибками = Ложь;
JSONДанные.ОтветОтСервера = ПрочитатьJSON(ЧтениеJSON, Ложь);
//Исключение
// Сообщить(ОписаниеОшибки());
//КонецПопытки;
ПоказатьОшибку выдает на строке
WinHttp.Send(ЗапросСтрока);
Выдает ошибку : Произошла исключительная ситуация (WinHttp.WinHttpRequest): Не удается установить соединение с сервером
Чет не то ты пишешь.
Ты же документацию кидаешь, там ясно написано что grant_type и scope в теле запроса. Нафига ты их в заголовки пихаешь?
Как-то так тогда уж:
WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
WinHttp.SetRequestHeader("accept", "application/json");
WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");
ЗапросСтрока = "grant_type=client_credentials&scope=https://api.sberbank.ru/rating/partner/legal";
WinHttp.Send(ЗапросСтрока);
И вот насчет того что scope задается какhttps://api.sberbank.ru/rating/partner/legal - я не уверен. Уточни этот момент.
Свои client id:client secret точно правильно кидаешь, в base64?
Ты же документацию кидаешь, там ясно написано что grant_type и scope в теле запроса. Нафига ты их в заголовки пихаешь?
Как-то так тогда уж:
WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
WinHttp.SetRequestHeader("accept", "application/json");
WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");
ЗапросСтрока = "grant_type=client_credentials&scope=https://api.sberbank.ru/rating/partner/legal";
WinHttp.Send(ЗапросСтрока);
И вот насчет того что scope задается как
Свои client id:client secret точно правильно кидаешь, в base64?
(39) до https://api.sberbank.ru/rating/partner/legalещё
не дошел. Сначала нужно получить. Скрины документации скинул в (20)
не дошел. Сначала нужно получить. Скрины документации скинул в (20)
(47)
JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
СтрокаСоединения = "https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";
//СтрокаСоединения = "https://dev.api.sberbank.ru/";
//ЗапросСтрока = "ru/prod/tokens/v2/oauth";
//Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "utf-8");
WinHttp.Open("POST", СтрокаСоединения, 0);
WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("x-ibm-client-id", "ad7f7d7f-bd5e-4331-8f8c-b095d570c6e7");
WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
WinHttp.SetRequestHeader("accept", "application/json");
WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");
ЗапросСтрока = "grant_type=client_credentials&scope=https://api.sberbank.ru/rating/partner/legal";
WinHttp.Send(ЗапросСтрока);
//Если НЕ СтруктураЗаголовков = Неопределено Тогда
// Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
// WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
// КонецЦикла;
//КонецЕсли;
WinHttp.Send(ЗапросСтрока);
//WinHttp.Send();
ТекстОтвета = WinHttp.ResponseText();
// получение JSON-данных
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
JSONДанные.ВыполненоСОшибками = Ложь;
JSONДанные.ОтветОтСервера = ПрочитатьJSON(ЧтениеJSON, Ложь);
Показать
(48) Параметры в URL вроде передаются через &, а значения через {}. Строка соединения вряд ли должна быть такая. Тут уже от API зависит.
Вот мой пример строки соединения
Сначала устанавливаем соединение с сервером. Потом передаем уже сроку соединения. У вас соединение вообще устанавливается?
Вот мой пример строки соединения
{"Subject":"1","Secret":"23","Serial":"ccb128a2-b8e7-11e4-b24e-bcaec574","Request":"pos/service/activate","Key":"MF6rjpEdWeoOPsBi+NycGeAVhLFb"}
Сначала устанавливаем соединение с сервером. Потом передаем уже сроку соединения. У вас соединение вообще устанавливается?
Уф. 10 строк что-ли написать не можете.
Параметры все уточняйте в техподдержке если не знаете.
grant_type и scope вероятно не такие.
АдресСервера = "dev.api.sberbank.ru";
АдресРесурса = "/ru/prod/tokens/v2/oauth";
Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Заголовки.Вставить("Authorization", "...");
Заголовки.Вставить("RqUID", "...");
Заголовки.Вставить("x-ibm-client-id", "...");
ДанныеТелаСтрокой = "grant_type=client_credentials&scope=https://api.sberbank.ru/rating/partner/legal";
Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Запрос.УстановитьТелоИзСтроки(ДанныеТелаСтрокой);
ОтветСервера = Соединение.ОтправитьДляОбработки(Запрос);
Тело = ОтветСервера.ПолучитьТелоКакСтроку();
Соединение = Неопределено;
ПоказатьПараметры все уточняйте в техподдержке если не знаете.
grant_type и scope вероятно не такие.
(50)
спросил и разработчиков и они ответили
grant_type: client_credentials
scope:https://api.sberbank.ru/rating/partner/legal
Но все равно выдает ошибку { "httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Client id not registered." }
grant_type и scope вероятно не такие
спросил и разработчиков и они ответили
grant_type: client_credentials
scope:
Но все равно выдает ошибку { "httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Client id not registered." }
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)