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

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)

/// Как получить страницу сайта через http-запрос
/// из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакПолучитьСтраницуСайтаЧерезHttpЗапросНаКлиенте()
 
    // В сети есть сайт http://example.com
    // Запросим содержимое его главной страницы.
 
    // Подключаемся к сайту.
    Соединение = Новый HTTPСоединение(
        "example.com", // сервер (хост)
        80, // порт, по умолчанию для http используется 80, для https 443
        , // пользователь для доступа к серверу (если он есть)
        , // пароль для доступа к серверу (если он есть)
        , // здесь указывается прокси, если он есть
        , // таймаут в секундах, 0 или пусто - не устанавливать
          // защищенное соединение, если используется https
    );
 
    // Получаем текст корневой страницы через GET-запрос.
    Запрос = Новый HTTPЗапрос("/");
    // Если бы нужна была другая страница, мы бы указали,
    // например, "/about" или "/news".
 
    Результат = Соединение.Получить(Запрос);
 
    Сообщить("Нам вернули код: " + Результат.КодСостояния);
    // Что примерно означают коды результата запроса:
    // [100, 299] - хороший код возврата
    // [300, 399] - нас перенаправляют на другую страницу,
    //              причём 302 - код постоянного перенаправления
    // [400, 499] - ошибка запроса
    // [500, 599] - ошибка сервера
 
    // в теле результата запроса - текст обычной html страницы
    Сообщить("Тело результата: " + Результат.ПолучитьТелоКакСтроку());   
 
КонецПроцедуры
 
/// Как обработать перенаправление в http-запросе
/// из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОбработатьПеренаправлениеВHttpЗапросеНаКлиенте()
 
    // Предположим, что мы хотим отправить поисковый http запрос
    // гуглу и получить от него страницу с результатами нашего
    // запроса.
 
    // К примеру, будем искать по строке "работа программистом 1с в моём городе".
 
    Соединение = Новый HTTPСоединение("www.google.com", 80);
 
    Запрос = Новый HTTPЗапрос("/search?q=работа программистом 1с в моём городе");
    Результат = Соединение.Получить(Запрос);
 
    Сообщить("Нам вернули код " + Результат.КодСостояния);
 
    Если Результат.КодСостояния = 302 Тогда
        Сообщить("Нас перенаправили на другую страницу.");
        Сообщить("Адрес этой страницы находится в заголовке результата Location.");
        Сообщить("Вот он: " + Результат.Заголовки.Получить("Location"));
 
        // Воспользуемся вспомогательной функцией СтруктураURI, которая
        // сама вытаскивает из адреса имя хоста, порт и путь к ресурсу.
 
        URI = СтруктураURI(Результат.Заголовки.Получить("Location"));
 
        // Делаем новое подключение и get запрос.
 
        Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт);
        Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
        Результат =  Соединение.Получить(Запрос);
 
        Сообщить("Нам вернули код " + Результат.КодСостояния);
 
        // Сохраним тело ответа (это и есть наша страница с результатами
        // поиска) в виде htm файла и тут же покажем его пользователю.
 
        КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1s.ru";
        СоздатьКаталог(КаталогДляЭкспериментов);
        ФайлРезультатов = КаталогДляЭкспериментов + "\test.htm";
 
        Текст = Новый ЗаписьТекста(ФайлРезультатов, КодировкаТекста.UTF8);
        Текст.Записать(Результат.ПолучитьТелоКакСтроку());
        Текст.Закрыть();
 
        Сообщить("Результаты поиска сохранены в " + ФайлРезультатов);
 
        ЗапуститьПриложение(ФайлРезультатов);
    КонецЕсли;
 
КонецПроцедуры
 
/// Как сохранить картинку с сайта через http-запрос
/// из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакСохранитьКартинкуСайтаЧерезHttpЗапросНаКлиенте()
 
    // Запрашивать через http можно не только html-страницы,
    // но и другие объекты, доступные нам через http,
    // например, картинки.
 
    // Сохраним на диск и покажем пользователю картинку, которая
    // размещена в интернете по адресу:
    // thumb7.shutterstock.com/display_pic_with_logo/1014806/270790184/
    // stock-photo-summer-holidays-background-sea-background-270790184.jpg
 
    Соединение = Новый HTTPСоединение("thumb7.shutterstock.com", 80);
 
    // Get-запрос к ресурсу на сервере.
    Запрос = Новый HTTPЗапрос("/display_pic_with_logo/1014806/270790184/" +
        "stock-photo-summer-holidays-background-sea-background-270790184.jpg");
    Результат = Соединение.Получить(Запрос);
 
    Сообщить("Нам вернули код " + Результат.КодСостояния);
 
    // Сама картинка - уже в теле ответа, осталось
    // только записать её в файл на диск в виде двоичных данных.
 
    КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1s.ru";
    СоздатьКаталог(КаталогДляЭкспериментов);
    ФайлКартинки = КаталогДляЭкспериментов + "\test.jpg";
 
    // Записываем картинку на диск.
    Результат.ПолучитьТелоКакДвоичныеДанные().Записать(ФайлКартинки);
 
    Сообщить("Сохранили картинку по адресу " + ФайлКартинки);
 
    // Покажем картинку пользователю.
    ЗапуститьПриложение(ФайлКартинки);    
 
КонецПроцедуры
 
/// Как послать защищенный https запрос к серверу из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакПослатьЗащищенныйHttpsЗапросКСерверуНаКлиенте()
 
    // Получим код страницы https://ya.ru
    // Так как для доступа к ней используется защищенный
    // протокол https - нам нужно заполнить последний
    // параметр при соединении с сервером.
 
    Соединение = Новый HTTPСоединение(
        "ya.ru", // сервер (хост)
        443, // порт, по умолчанию для http используется 80, для https 443
        , // пользователь для доступа к серверу (если он есть)
        , // пароль для доступа к серверу (если он есть)
        , // здесь указывается прокси, если он есть
        , // таймаут в секундах, 0 или пусто - не устанавливать
       Новый ЗащищенноеСоединениеOpenSSL()
    );
 
    // Получаем текст корневой страницы через GET-запрос.
    Запрос = Новый HTTPЗапрос("/");
    // Если бы нужна была другая страница, мы бы указали,
    // например, "/about" или "/news".
 
    Результат = Соединение.Получить(Запрос);
    Сообщить(Результат.КодСостояния);
    Сообщить(Результат.ПолучитьТелоКакСтроку());
 
КонецПроцедуры
 
/// Как установить заголовки http-запроса из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакУстановитьЗаголовкиHttpЗапросаНаКлиенте()
 
   // Возьмём чисто гипотетический пример.
 
   // Нам нужно послать запрос к http://example.com/,
   // передав ему в куках (cookie) session=231.
   // Также мы будем передадим в запросе поле keep-alive,
   // чтобы сервер не закрывал наше соединений к нему
   // для повторых запросов.
 
   // За всё это отвечают заголовки запроса.
 
   Заголовки = Новый Соответствие;
   Заголовки.Вставить("Cookie", "session=231");
   Заголовки.Вставить("Connection", "keep-alive");
 
    // Подключаемся к сайту.
    Соединение = Новый HTTPСоединение("example.com");
 
    // Получаем текст корневой страницы через GET-запрос.
    Запрос = Новый HTTPЗапрос("/", Заголовки);
    // Если бы нужна была другая страница, мы бы указали,
    // например, "/about" или "/news".
 
    Результат = Соединение.Получить(Запрос);
 
КонецПроцедуры
 
/// Как указать прокси для http-запроса из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакУказатьПроксиДляHttpЗапросаНаКлиенте()
 
   // Если для соединения с интернетом используется прокси,
   // его нужно указывать так.
 
    ПроксиСервер = Новый ИнтернетПрокси;
    // авторизация
    ПроксиСервер.Пользователь = "Vova";
    ПроксиСервер.Пароль = "123";
    // прокси сервер прописывается для каждого протокола отдельно
    ПроксиСервер.Установить("http", "192.168.0.1", "8080");
    ПроксиСервер.Установить("https", "192.168.0.1", "6547");
 
    // Созданный объект указываем при http соединении.
 
    Соединение = Новый HTTPСоединение("example.com",,,, ПроксиСервер);
 
КонецПроцедуры
 
/// Как послать 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=" + 
        "&lt=" + 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);
 
КонецФункции
 
/// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)

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

<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

С уважением, (преподаватель школы 1С программистов и разработчик обновлятора).



Владимир Милькин
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться: