Работа с http-запросами (get и post) в языке 1С 8.3, 8.2 (в примерах)
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
2017-12-18T22:36:21+00:00<<< 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=" + "<=" + 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 ТекстовыйДокумент ТабличныйДокумент