Получить консультацию

Http запросы GET и POST в языке 1С 8. Примеры работы

В статье приводятся практические примеры работы с самыми часто используемыми 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", ЗапросСервера);

На этом все, надеюсь, данная статья была для вас полезной.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

пятнадцать − семь =

К НАЧАЛУ