В статье приводятся практические примеры работы с самыми часто используемыми HTTP запросами средствами языка 1С – GET и POST.
Содержание
Общая информация
Для различного рода интеграций, обменов данными и взаимодействия между разными системами широко используется протокол http, и платформа 1С имеет ряд инструментов и объектов для работы с этим протоколом.
Основные объекты языка 1С, предназначенные для работы с протоколом http – HTTPСоединение, HTTPЗапрос и HTTPОтвет. Для организации работы через прокси-сервер используется объект ИнтернетПрокси, а для создания защищенного https-соединения существует объект ЗащищенноеСоединениеOpenSSL. Есть еще ряд объектов, которые могут применяться при работе с протоколом HTTP, но они используются достаточно редко, а потому в данной статье не рассматриваются.
HTTPСоединение отвечает за создание соединения с сервером по протоколу HTTP. Свойства этого объекта позволяют задать параметры авторизации, такие как логин, пароль и признак аутентификации ОС, а также параметры подключения – адрес сервера, порт, прокси, таймаут, и защищенное соединение. Методы объекта HTTPСоединение повторяют основные методы HTTP, такие как Get, Post, Put, Delete и др.
HTTPЗапрос позволяет задать заголовки, адрес запрашиваемого ресурса и тело запроса. Методы данного объекта предназначены для различных способов получения и установки тела запроса.
HTTPОтвет является результатом отправки запроса через соединение. В свойствах этого объекта будут содержаться ответные заголовки и код состояния, а методы предназначены для получения тела ответа в различном виде (например, как двоичные данные или в виде строки).
Полезные ресурсы:
ИнтернетПрокси, как следует из названия, используется для указания настроек прокси-сервера. Для каждого протокола можно независимо указать параметры прокси-сервера при помощи метода Установить().
ЗащищенноеСоединениеOpenSSL используется для создания защищенного соединения OpenSSL. Есть возможность указать сертификат клиента и/или удостоверяющего центра, но в большинстве случаев, при организации доступа к обычным сайтам по протоколу HTTPS, сертификаты указывать не требуется.
Http запрос с использованием защищенного соединения
Защищенное подключение используется для соединения с сервером по протоколу https. В случае, если запрашиваемый ресурс требует наличия сертификатов, существует возможность указать как клиентский сертификат, так и сертификаты удостоверяющих центров. Есть несколько нюансов, на которые стоит обратить внимание.
Объект клиентского сертификата СертификатКлиентаФайл (с приватным ключом), загружается из файла с форматом :
*.PFX; *.P12 – файл сертификата формата P12;
*.PEM – файл сертификата формата PEM.
по умолчанию – файл сертификата формата PEM.
Объект клиентского сертификата СертификатКлиентаWindows загружается из системного хранилища сертификатов операционной системы MS Windows.
// Для большинства интернет-сайтов сертификаты указывать не требуется.
// При необходимости следует задать сертификат для клиента и/или для удостоверяющих центров.
// ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
БезопасноеСоединение = Новый HTTPСоединение("yandex.ru",443,,,,,ЗащищенноеСоединение);
Ответ = БезопасноеСоединение.Получить(Новый HTTPЗапрос("/"));
Если Ответ.КодСостояния = 200 Тогда
Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Использование заголовков в http запросах в языке 1С
Для передачи кукис (Cookie), кэширования, хранения данных пользовательской сессии, выполнения запроса с указанием конкретного браузера, и для многих других целей, используются заголовки http запросов. Заголовки – это обычное соответствие, с парами Ключ: Значение. Помимо стандартных заголовков разработчик может передавать свои собственные, если это предусмотрено логикой принимающего сервера.
Соединение = Новый HTTPСоединение("yandex.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1");
Заголовки.Вставить("Cookie", "id=12345");
Ответ = Соединение.Получить(Новый HTTPЗапрос("/", Заголовки));
Получить страницу сайта при помощи http запроса GET
Get-запросу в языке 1С соответствует метод Получить(). Для большинства современных сайтов необходимо использовать защищенное соединение.
// Подключение к сайту 1c.alexcode.ru.
// Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>, <ИспользоватьАутентификациюОС>)
СоединениеHTTP = Новый HTTPСоединение("1c.alexcode.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
// Получение текста главной страницы через запрос.
ЗапросHTTP = Новый HTTPЗапрос("/"); // Можно указать любую нужную страницу например, "/about" или "/contacts"
Ответ = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос
Если Ответ.КодСостояния = 200 Тогда
Сообщить(Ответ.ПолучитьТелоКакСтроку()); //получим HTML-код страницы
Иначе
Сообщить("Код ответа: "+Ответ.КодСостояния); //анализируем код состояния и делаем выводы
КонецЕсли;
Сохранить картинку с сайта через GET-запрос
При помощи http протокола можно получать не только текстовые данные (html, json, xml и т.п.), но и другие объекты, доступные по url адресу – медиа-файлы, картинки и другие ресурсы. Рассмотрим пример получения логотипа компании 1С:
Соединение = Новый HTTPСоединение("static.1c.ru");
Запрос = Новый HTTPЗапрос("/images/logo.png");
// Вариант 1. Укажем имя выходного файла.
// Используются обычные слэши
ПутьДляСохранения = "C:/1c_logo.png";
Ответ = Соединение.Получить(Запрос, ПутьДляСохранения);
// Вариант 2. Получим из ответа двоичные данные
// В Windows используются обратные слэши, в Unix-подобных системах (Linux) - обычные слэши
// После их можно обработать, сохранить в ХранилищеЗначений в базу данных,
// либо сохранить их также в файл
ПутьДляСохранения = "C:\1c_logo_2.png";
Ответ = Соединение.Получить(Запрос);
Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ПутьДляСохранения);
Как обработать перенаправление (redirect) http запроса в 1С
Переадресация при http запросе может возникнуть по разным причинам. Самые популярные:
- смена адреса запрашиваемого ресурса (например, изменили название статьи, и вместе с ним – адрес)
- переадресация с www
- редирект с http на https
При переадресации сервер возвращает в заголовках параметр Location, в котором указано новое назначение.. Далее разработчик может проанализировать эту строку, выделить сервер, путь к ресурсу, логин и пароль, и сформировать новый запрос. Следует иметь в виду, что редиректов может быть несколько, и переадресация будет идти по цепочке. Рассмотрим простой пример переадресации с незащищенного соединения на безопасное по протоколу https:
СоединениеHTTP = Новый HTTPСоединение("1c.alexcode.ru", 80);
ЗапросHTTP = Новый HTTPЗапрос("/");
Ответ = СоединениеHTTP.Получить(ЗапросHTTP);
Если Ответ.КодСостояния = 200 Тогда
Сообщить(Ответ.ПолучитьТелоКакСтроку()); //получим HTML-код страницы
ИначеЕсли Ответ.КодСостояния = 301 Тогда // постоянная переадресация
Сообщить(Ответ.Заголовки.Получить("Location")); //куда нас отправляют
// СтруктураURI - служебная функция, которая раскладывает адресную строку
// и возвращает удобную структуру с параметрами подключения.
URI = СтруктураURI(Ответ.Заголовки.Получить("Location"));
Если URI.Схема = "https" Тогда
// обработаем перенаправление на защищенное соединение
БезопасноеСоединение = Новый HTTPСоединение(URI.ИмяСервера,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
//путь к ресурсу также возьмем из структуры URI
Ответ = БезопасноеСоединение.Получить(Новый HTTPЗапрос(URI.ПутьНаСервере));
Если Ответ.КодСостояния = 200 Тогда
Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
КонецЕсли;
Иначе
Сообщить("Код ответа: "+Ответ.КодСостояния);
КонецЕсли;
&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт
СтрокаURI = СокрЛП(СтрокаURI);
Схема = "";
Позиция = Найти(СтрокаURI, "://");
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция - 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = "";
Позиция = Найти(СтрокаСоединения, "/");
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
КонецЕсли;
СтрокаАвторизации = "";
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, "@");
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;
Логин = СтрокаАвторизации;
Пароль = "";
Позиция = Найти(СтрокаАвторизации, ":");
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция - 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;
Хост = ИмяСервера;
Порт = "";
Позиция = Найти(ИмяСервера, ":");
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция - 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("Схема", Схема);
Результат.Вставить("Логин", Логин);
Результат.Вставить("Пароль", Пароль);
Результат.Вставить("ИмяСервера", ИмяСервера);
Результат.Вставить("Хост", Хост);
Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
Возврат Результат;
КонецФункции
Использование прокси сервера для http запросов в 1С
Интернет-прокси может использоваться для соединения по различным протоколам: http, https, ftp и ftps. Для каждого протокола необходимо вызвать метод Установить() с указанием нужных параметров – логина, пароля, адреса Proxy-сервера и т.д.
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "hostname", 8000, "login", "password");
//Прокси.Установить("https", "hostname", 8000, "login", "password");
Соединение = Новый HTTPСоединение("example.com",,,,Прокси);
Ответ = Соединение.Получить(Новый HTTPЗапрос);
Использование http запросов типа POST в 1С 8
Запросы Post широко применяются в том случае, когда нужно передать на сервер какие-то данные для дальнейшей обработки – провести авторизацию, загрузить файл, передать большой массив данных в качестве параметров, и т.п.
Get запросы также имеют возможность параметризации, но длина адресной строки ограничена 2048 символами. Поэтому, если, например, вам нужно передать в качестве параметров 1000 наименований номенклатуры или 1000 электронных адресов сотрудников, для этого отлично подойдет post запрос. Post запрос отличается от запроса get тем, что помимо строки запроса и заголовков, имеет еще и тело запроса.
В языке 1С запросу POST соответствует метод ОтправитьДляОбработки(). Средствами языка 1С тело запроса может быть установлено из файла, из строки либо из двоичных данных.
Тип передаваемых данных указывается заголовком Content-Type
Полезные ресурсы:
Как отправить файл при помощи POST-запроса из 1С
Рассмотрим простой пример передачи одного файла при помощи http запроса POST средствами языка 1С.
//Имя можно получить разными способами - например, из диалога выбора файла, из реквизита в базе, или указать в коде
имяФайлаОтправки = "D:\test.html";
ФайлОтправки = Новый Файл(имяФайлаОтправки);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "text/html;charset=utf-8");
Заголовки.Вставить("Content-Lenght", РазмерФайлаОтправки);
Соединение = Новый HTTPСоединение("www.mysite.com");
ЗапросОтправки = Новый HTTPЗапрос;
ЗапросОтправки.УстановитьИмяФайлаТела(имяФайлаОтправки);
ЗапросОтправки.Заголовки = Заголовки;
Соединение.ОтправитьДляОбработки(ЗапросОтправки);
Также возможно формирование тела запроса из двоичных данных. Двоичные данные можно сформировать любым доступным способом. Более подробно о работе с двоичными данными читайте в этой статье.
ПутьКФайлу = "C:\Temp\data.zip";
ДанныеТела = Новый ДвоичныеДанные(ПутьКФайлу);
Соединение = Новый HTTPСоединение("myServer.com");
ЗапросСервера = Новый HTTPЗапрос("upload.php");
ЗапросСервера.УстановитьТелоИзДвоичныхДанных(ДанныеТела);
ОтветСервера = Соединение.ВызватьHTTPМетод("POST", ЗапросСервера);
На этом все, надеюсь, данная статья была для вас полезной.
Хорошая статья, но я ищу с авторизацией через Токен к получению JSON
Спасибо за полезную и доступную статью