Работа с http-запросами (post) в языке 1С 8.3

Aug 15, 2022 09:57


/// Как послать post-запрос через http из 1с 8.3, 8.2

&НаКлиенте
Процедура КакПослатьPostЗапросНаКлиенте()

// Post-запрос отличается от Get-запроса только наличием
// тела запроса.

// То есть этот тот же самый HTTPЗапрос, но у которого
// вызыван метод УстановитьТелоИзСтроки.
// И это тело уже может быть и просто текстом, и текстом
// в формате xml, json, soap и так далее.

// В качестве большого примера рассмотрим фрагмент
// авторизации на сайте 1с, там используются и get
// и post запросы.

// Откуда мы узнали как и когда посылать какие запросы?
// Мы подсмотрели их у браузера (в Хроме нажмите F12, вкладка Network),
// а также использовали беплатный инструмент Fiddler
// для отладки и мониторинга http запросов.

// Если бы мы писали рабочий код - нам понадобилось
// всего несколько соединений с сервером, которые
// мы бы не закрывали. Но в учебных целях будем
// писать максимально просто ("тупо").

// 1. Первым делом - посылаем get-запрос к
// https://releases.1c.ru/total
 
Соединение = Новый HTTPСоединение("releases.1c.ru",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/total");
Результат = Соединение.Получить(Запрос);

// В куках нам должны вернуть идентификатор сессии.
Куки = Результат.Заголовки.Получить("Set-Cookie");
// Он идёт первым параметром и отделён от остальных
// частей точкой с запятой.
Куки = СтрЗаменить(Куки, ";", Символы.ПС);
ИдентификаторСессии1 = СтрПолучитьСтроку(Куки, 1);

Сообщить(ИдентификаторСессии1);

// 2. В результате первого запроса нас перенаправили
// на другую страницу, перейдём на неё новым get-запросом.
Перенаправление = Результат.Заголовки.Получить("Location");

Сообщить("Код возврата " + Результат.КодСостояния);
Сообщить("Нас перенаправили на " + Перенаправление);

// При помощи служебной функции СтруктураURI разберём
// новый адрес на части.

URI = СтруктураURI(Перенаправление);

Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
Результат = Соединение.Получить(Запрос);

// В куках нам вернули второй идентификатор.
Куки = Результат.Заголовки.Получить("Set-Cookie");
Куки = СтрЗаменить(Куки, ";", Символы.ПС);
ИдентификаторСессии2 = СтрПолучитьСтроку(Куки, 1);

Сообщить(ИдентификаторСессии2);

// 3. В результате предыдущего Get-запроса в теле нам вернули
// страницу авторизации, вытащим из формы авторизации значения
// параметров name="lt", name="execution" и name="_eventId",
// чтобы затем сформировать код приглашения на сайт.

ltValue = "";
executionValue = "";
_eventIdValue = "";

Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(Результат.ПолучитьТелоКакСтроку());
Для Индекс = 0 По Текст.КоличествоСтрок() Цикл
Строка = Текст.ПолучитьСТроку(Индекс);
Если Найти(Строка, "name=""lt""") > 0 Тогда
ltValue = ВытащитьЗначениеИзСтроки(Строка);
ИначеЕсли Найти(Строка, "name=""execution""") > 0 Тогда
executionValue = ВытащитьЗначениеИзСтроки(Строка);
ИначеЕсли Найти(Строка, "name=""_eventId""") > 0 Тогда
_eventIdValue = ВытащитьЗначениеИзСтроки(Строка);
КонецЕсли;
КонецЦикла;

Сообщить(ltValue);
Сообщить(executionValue);
Сообщить(_eventIdValue);

// Для формирования кода приглашения нам понадобится
// наш логин и пароль от ИТС.

ЛогинИТС = "";
ПарольИТС = "";

Если ЛогинИТС = "" Или ПарольИТС = "" Тогда
Сообщить("Для продолжения укажите в коде логин и пароль от ИТС.");
Возврат;
КонецЕсли;

КодПриглашения = "inviteCode=" +
"<=" + ltValue +
"&execution=" + executionValue +
"&_eventId=" + _eventIdValue +
"&username=" + ЛогинИТС +
"&password=" + ПарольИТС;

// 4. Наконец, посылаем Post-запрос, вкладывая в тело запроса
// код приглашения, а куках указыаем второй идентификатор сессии.

Ресурс =
"/login;" +
ИдентификаторСессии2 +
"?service=https%3A%2F%2Fusers.v8.1c.ru%2Fdistribution%2Fpublic%2Fsecurity_check%3B" +
ИдентификаторСессии1;

Соединение = Новый HTTPСоединение("login.1c.ru",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());

Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", ИдентификаторСессии2);
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");

Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзСтроки(КодПриглашения);

Результат = Соединение.ОтправитьДляОбработки(Запрос);

Сообщить("Нам вернули код " + Результат.КодСостояния);
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("И перенаправили на " + Перенаправление);

// 5. В завершении авторизации переходим на следующую
// страницу, используя первый идентификатор сессии.

URI = СтруктураURI(Перенаправление);

Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
Новый ЗащищенноеСоединениеOpenSSL());

Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", ИдентификаторСессии1);

Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере, Заголовки);
Результат = Соединение.Получить(Запрос);

Сообщить("Нам вернули " + Результат.КодСостояния);
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("И окончательно перенаправили на " + Перенаправление);

// Авторизация окончена, теперь можем запрашивать любые
// страницы сайта, используя первый идентификатор сессии.

КонецПроцедуры

&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт

СтрокаURI = СокрЛП(СтрокаURI);

// схема
Схема = "";
Позиция = Найти(СтрокаURI, "://");
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция - 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;

// строка соединения и путь на сервере
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = "";
Позиция = Найти(СтрокаСоединения, "/");
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
КонецЕсли;

// информация пользователя и имя сервера
СтрокаАвторизации = "";
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, "@");
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;

// логин и пароль
Логин = СтрокаАвторизации;
Пароль = "";
Позиция = Найти(СтрокаАвторизации, ":");
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция - 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;

// хост и порт
Хост = ИмяСервера;
Порт = "";
Позиция = Найти(ИмяСервера, ":");
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция - 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;

Результат = Новый Структура;
Результат.Вставить("Схема", Схема);
Результат.Вставить("Логин", Логин);
Результат.Вставить("Пароль", Пароль);
Результат.Вставить("ИмяСервера", ИмяСервера);
Результат.Вставить("Хост", Хост);
Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
Результат.Вставить("ПутьНаСервере", ПутьНаСервере);

Возврат Результат;

КонецФункции

&НаКлиенте
Функция ВытащитьЗначениеИзСтроки(Строка)

Позиция2 = СтрДлина(Строка);
Пока Позиция2 > 1 Цикл
Если Сред(Строка, Позиция2, 1) = """" Тогда
Прервать;
КонецЕсли;
Позиция2 = Позиция2 - 1;
КонецЦикла;

Позиция1 = Позиция2 - 1;
Пока Позиция1 > 1 Цикл
Если Сред(Строка, Позиция1, 1) = """" Тогда
Прервать;
КонецЕсли;
Позиция1 = Позиция1 - 1;
КонецЦикла;

Возврат Сред(Строка, Позиция1 + 1, Позиция2 - Позиция1 - 1);

КонецФункции
Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

программирование

Previous post Next post
Up