POST запрос возвращает код 400 в толстом клиенте, в тонком работает, в чем беда?
Добрый день!
Уже всю голову себе сломал, может тут умные люди помогут?)
Есть элементарный POST-запрос к HTTPs сервису, который по логину и паролю переданным в json возвращает "токен" для дальнейшей авторизации с другими запросами.
Если этот код выполняется в тонком клиенте с разбивной на выполнение &НаКлиенте и &НаСервере, то токен в итоге сервис возвращает, если РОВНО ЭТОТ ЖЕ КОД выполняется в толстом клиенте, то в ответ сервис присылает "код=400"
Код для ТОНКОГО клиента, который норм отрабатывает:
КОД ДЛЯ ТОЛСТОГО КЛИЕНТА (чуть упрощен, но все основные фунции сохранены), вот он не работает:
То есть "верхний" запускаю, например из УТ 11, токен получаю.
"Нижний" код запускаю из УТ 10.3 и в итоге Код ответа = 400, типа ошибка в запросе.
Проверялось на одинаковых версиях платформ, на разных, в том числе на 8.3.20.1710
Уже всю голову себе сломал, может тут умные люди помогут?)
Есть элементарный POST-запрос к HTTPs сервису, который по логину и паролю переданным в json возвращает "токен" для дальнейшей авторизации с другими запросами.
Если этот код выполняется в тонком клиенте с разбивной на выполнение &НаКлиенте и &НаСервере, то токен в итоге сервис возвращает, если РОВНО ЭТОТ ЖЕ КОД выполняется в толстом клиенте, то в ответ сервис присылает "код=400"
Код для ТОНКОГО клиента, который норм отрабатывает:
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура КомандаПолучитьТокен(Команда)
Токен = ПолучитьТокен();
КонецПроцедуры
#КонецОбласти // ОбработчикиКомандФормы
#Область СлужебныеПроцедурыИФункции
&НаСервере
Функция НастройкиПодключения() Экспорт
Результат = Новый Структура(
"Сервер, Порт, Таймаут, ЗащищенноеСоединение, Логин, Пароль",
Сервер,
Порт,
Таймаут,
ЗащищенноеСоединение,
Логин,
Пароль);
Возврат Результат;
КонецФункции
&НаСервере
Функция ПолучитьТокен(НастройкиПодключения = Неопределено) Экспорт
Попытка
Если НастройкиПодключения = Неопределено Тогда
НастройкиПодключения = НастройкиПодключения();
КонецЕсли;
Если НастройкиПодключения.ЗащищенноеСоединение Тогда
ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL;
Иначе
ЗащищенноеСоединениеOpenSSL = Неопределено;
КонецЕсли;
HTTPСоединение = Новый HTTPСоединение(
НастройкиПодключения.Сервер,
НастройкиПодключения.Порт,
,
,
,
НастройкиПодключения.Таймаут,
ЗащищенноеСоединениеOpenSSL);
Данные = Новый Структура;
Данные.Вставить("login", НастройкиПодключения.Логин);
Данные.Вставить("password", НастройкиПодключения.Пароль);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
ТелоЗапроса = ЗаписьJSON.Закрыть();
АдресРесурса = "auth/sign-in";
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если НЕ HTTPОтвет.КодСостояния = 201
И НЕ HTTPОтвет.КодСостояния = 200 Тогда
ВызватьИсключение "Код состояния: " + HTTPОтвет.КодСостояния;
КонецЕсли;
СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Ответ = ПрочитатьJSON(ЧтениеJSON, Ложь);
ЧтениеJSON.Закрыть();
Токен = Ответ["token"];
Если Токен = "" Тогда
ВызватьИсключение "Токен пустой";
КонецЕсли;
Исключение
Токен = "";
ТекстСообщения = "Не удалось получить токен:"
+ Символы.ПС + ОписаниеОшибки();
ЗаписатьВЖурнал(ТекстСообщения,, "Загрузка данных", УровеньЖурналаРегистрации.Ошибка);
КонецПопытки;
Возврат Токен;
КонецФункции
ПоказатьКОД ДЛЯ ТОЛСТОГО КЛИЕНТА (чуть упрощен, но все основные фунции сохранены), вот он не работает:
Функция ПолучитьТокен()
Логин = "**********";
Пароль = "**********";
ssl1 = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение("sintec.club",11000,,,,60,ssl1);
Данные = Новый Структура;
Данные.Вставить("login", Логин);
Данные.Вставить("password", Пароль);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
ТелоЗапроса = ЗаписьJSON.Закрыть();
АдресРесурса = "auth/sign-in";
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если НЕ HTTPОтвет.КодСостояния = 201
И НЕ HTTPОтвет.КодСостояния = 200 Тогда
Сообщить("Код состояния: " + HTTPОтвет.КодСостояния);
КонецЕсли;
СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Ответ = ПрочитатьJSON(ЧтениеJSON, Ложь);
ЧтениеJSON.Закрыть();
Токен = Ответ["token"];
Возврат Токен;
КонецФункции
ПоказатьТо есть "верхний" запускаю, например из УТ 11, токен получаю.
"Нижний" код запускаю из УТ 10.3 и в итоге Код ответа = 400, типа ошибка в запросе.
Проверялось на одинаковых версиях платформ, на разных, в том числе на 8.3.20.1710
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(7) HTTPСоединение = Новый HTTPСоединение()
там копать надо
для разных версий платформ он разный был
вот так у нас для УТ 10.3 работает
и тоже самое но для УТ 11
там копать надо
для разных версий платформ он разный был
вот так у нас для УТ 10.3 работает
Соединение = Новый HTTPСоединение(<СервисАдрес>);
и тоже самое но для УТ 11
Соединение = Новый HTTPСоединение(<СервисАдрес>,,,,,, Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено));
(9)
Это я всё в курсе, гляньте код, там всё ок.
Дело видимо и правда в версии TSL.... щас сменю режим совместимости в УТ 10.3 на то, под которым работает запрос в УТ 11, не факт конечно что получится, там же всякие функции еще меняются, перестают действовать, или наоборот новые появляеются... но попробую
Это я всё в курсе, гляньте код, там всё ок.
Дело видимо и правда в версии TSL.... щас сменю режим совместимости в УТ 10.3 на то, под которым работает запрос в УТ 11, не факт конечно что получится, там же всякие функции еще меняются, перестают действовать, или наоборот новые появляеются... но попробую
(10) у нас взлетело именно так, как я показал, смена режима совместимости не помогала
но было и такое, что ничего вообще не помогало, без отключения проверки сертификата никак не работало, а для 8.2 этого не сделать, пришлось мутить через winhttp
если надо, могу дать пример кода
но было и такое, что ничего вообще не помогало, без отключения проверки сертификата никак не работало, а для 8.2 этого не сделать, пришлось мутить через winhttp
если надо, могу дать пример кода
(12)
WinHttp = ПодключитьВнешнююКомпоненту("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"utf-8");
//Отключаем проверку сертификата
Если отключитьSSLсертификат = 1 Тогда
Скрипт= ПодключитьВнешнююКомпоненту("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Скрипт.AddObject("WinHttp",WinHttp);
Скрипт.Eval("WinHttp.Option(4)=13056"); // intSslErrorIgnoreFlags
Скрипт.Eval("WinHttp.Option(6)=true"); // blnEnableRedirects
Скрипт.Eval("WinHttp.Option(12)=true"); // blnEnableHttpsToHttpRedirects
КонецЕсли;
WinHttp.Open("POST", <СервисАдрес>+"/"+<СервисаAPIРесурс>, 0);
WinHttp.setRequestHeader("Content-Type" , "application/json; charset=utf-8");
WinHttp.setRequestHeader("X-ProductKey" , <СервисКлючДоступа>);
WinHttp.Send(СтруктураДанныхJSON);
Исключение
СообщитьПользователю(ОписаниеОшибки());
ОтветРезультат = 402;
Возврат ОтветРезультат;
КонецПопытки;
ОтветРезультат = WinHttp.Status;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот