В этой статье я попробую рассказать о том, какими средствами располагает технологическая платформа для работы с протоколом HTTP. В начале будет немного общей информации, а затем конкретные примеры. Отмечу, что в статье используется технологическая платформа версии 8.3.12.1595.
- Общая информация
- Практические задачи при работе с HTTP
- Как получить страницу GET-запросом?
- Как обработать перенаправление в HTTP-запросе?
- Как сделать HTTPS-запрос из 1С?
- Как сделать HTTP/HTTPS запрос через прокси-сервер из 1С?
- Как установить заголовки в HTTP-запросе из 1С?
- Как сохранить картинку или скачать файл с сайта HTTP-запросом из 1С?
- Как послать POST-запрос из 1С?
Общая информация
Для работы с протоколом HTTP в 1С существуют три основных объекта — HTTPСоединение, HTTPЗапрос и HTTPОтвет, кроме этого для создания HTTPS-соединения используется объект ЗащищенноеСоединениеOpenSSL, а для соединения через прокси-сервер объект ИнтернетПрокси. Существует еще несколько объектов, которые могут использоваться при работе с протоколом HTTP, но используются они достаточно редко и не так важны.
Назначение основных объектов следует из названия.
HTTPСоединение отвечает за соединение с сервером — в свойствах объекта, помимо обязательного адреса, можно указать порт, прокси, логин, пароль, таймаут, защищенное соединение и флаг аутентификации ОС, а методы повторяют основные методы HTTP.
HTTPЗапрос позволяет описать что именно мы хотим от сервера — в свойствах нужно обязательно указать адрес ресурса к которому мы обращаемся, кроме этого имеется возможность указать какие-либо заголовки, методы же, в свою очередь, позволяют различными способами установить и получить тело запроса.
HTTPОтвет является результатом выполнения запроса к серверу — из свойств мы можем узнать ответные заголовки и код состояния, а методы позволяют получить тело ответа различными способами.
ИнтернетПрокси позволяет указать настройки прокси-сервера — с помощью метода Установить() можно указать параметры для подключения к прокси-серверу, отмечу, что свойства «Пароль» и «Пользователь» являются устаревшими, использовать их не рекомендуется.
ЗащищенноеСоединениеOpenSSL создает защищенное соединение OpenSSL — имеется возможность указать сертификат клиента и/или сертификат удостоверяющего центра, в большинстве случаев (для доступа к обычным сайтам по протоколу HTTPS) указывать какие либо сертификаты не требуется.
Заканчиваем с теорией и переходим к практике.
Практические задачи при работе с HTTP
В качестве практической части рассмотрим задачи, которые чаще всего встречаются при работе с протоколом HTTP в 1С
Как получить страницу GET-запросом?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | &НаКлиенте Процедура ПолучитьСтраницуЗапросомGET(Команда) Соединение = Новый HTTPСоединение("example.com"); Запрос = Новый HTTPЗапрос("/"); //В запросе можно обратиться к нужному ресурсу и с нужными параметрами //Запрос = Новый HTTPЗапрос("/index.php?param1=1¶m2=2"); Ответ = Соединение.Получить(Запрос); Если Ответ.КодСостояния = 200 Тогда Сообщить(Ответ.ПолучитьТелоКакСтроку()); //получим HTML-код страницы Иначе Сообщить("Код ответа: "+Ответ.КодСостояния); //анализируем код состояния и делаем выводы КонецЕсли; КонецПроцедуры |
Как обработать перенаправление в HTTP-запросе?
При попытке получить главную страницу Яндекса мы получаем ответ, что страница «перемещена временно» (код состояния 302). При помощи заголовка Location мы можем определить куда нас отправляет сервер — на безопасную версию главной страницы Яндекса (на большинстве современных ресурсов действует переадресация с http на https).
Далее разбиваем адрес из заголовка Location на составные части, при помощи функции «СтруктураURI», которую я позаимствовал из библиотеки стандартных подсистем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | &НаКлиенте Процедура ОбработкаПеренаправленияHTTPЗапрос1С(Команда) Соединение = Новый HTTPСоединение("yandex.ru"); Запрос = Новый HTTPЗапрос("/"); Ответ = Соединение.Получить(Запрос); Если Ответ.КодСостояния = 200 Тогда Сообщить(Ответ.ПолучитьТелоКакСтроку()); ИначеЕсли Ответ.КодСостояния = 302 Тогда //переадресация Сообщить(Ответ.Заголовки.Получить("Location")); //куда нас отправляют URI = СтруктураURI(Ответ.Заголовки.Получить("Location")); //получаем структуру URI Сообщить(URI.Схема); Сообщить(URI.ИмяСервера); Иначе Сообщить("Код ответа: "+Ответ.КодСостояния); КонецЕсли; КонецПроцедуры &НаКлиенте Функция СтруктураURI(Знач СтрокаURI) Экспорт СтрокаURI = СокрЛП(СтрокаURI); Схема = ""; Позиция = Найти(СтрокаURI, "://"); Если Позиция > 0 Тогда Схема = НРег(Лев(СтрокаURI, Позиция - 1)); СтрокаURI = Сред(СтрокаURI, Позиция + 3); КонецЕсли; СтрокаСоединения = СтрокаURI; ПутьНаСервере = ""; Позиция = Найти(СтрокаСоединения, "/"); Если Позиция > 0 Тогда ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1); СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1); КонецЕсли; СтрокаАвторизации = ""; ИмяСервера = СтрокаСоединения; Позиция = Найти(СтрокаСоединения, "@"); Если Позиция > 0 Тогда СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1); ИмяСервера = Сред(СтрокаСоединения, Позиция + 1); КонецЕсли; Логин = СтрокаАвторизации; Пароль = ""; Позиция = Найти(СтрокаАвторизации, ":"); Если Позиция > 0 Тогда Логин = Лев(СтрокаАвторизации, Позиция - 1); Пароль = Сред(СтрокаАвторизации, Позиция + 1); КонецЕсли; Хост = ИмяСервера; Порт = ""; Позиция = Найти(ИмяСервера, ":"); Если Позиция > 0 Тогда Хост = Лев(ИмяСервера, Позиция - 1); Порт = Сред(ИмяСервера, Позиция + 1); КонецЕсли; Результат = Новый Структура; Результат.Вставить("Схема", Схема); Результат.Вставить("Логин", Логин); Результат.Вставить("Пароль", Пароль); Результат.Вставить("ИмяСервера", ИмяСервера); Результат.Вставить("Хост", Хост); Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено)); Результат.Вставить("ПутьНаСервере", ПутьНаСервере); Возврат Результат; КонецФункции |
Как сделать HTTPS-запрос из 1С?
Немного изменим предыдущий пример — теперь при получении кода 302 мы создаем безопасное соединение и выполняем HTTPS-запрос (адрес сервера и адрес ресурса берем из структуры URI). Функцию «СтруктураURI» можно взять из примера выше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | &НаКлиенте Процедура HTTPSЗапросИз1С(Команда) Соединение = Новый HTTPСоединение("yandex.ru"); Запрос = Новый HTTPЗапрос("/"); Ответ = Соединение.Получить(Запрос); Если Ответ.КодСостояния = 302 Тогда URI = СтруктураURI(Ответ.Заголовки.Получить("Location")); Если URI.Схема = "https" Тогда //создадим новое, на этот раз безопасное, соединение БезопасноеСоединение = Новый HTTPСоединение(URI.ИмяСервера,443,,,,,Новый ЗащищенноеСоединениеOpenSSL()); //путь к ресурсу также возьмем из структуры URI Ответ = БезопасноеСоединение.Получить(Новый HTTPЗапрос(URI.ПутьНаСервере)); Если Ответ.КодСостояния = 200 Тогда Сообщить(Ответ.ПолучитьТелоКакСтроку()); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры |
Как сделать HTTP/HTTPS запрос через прокси-сервер из 1С?
При установке параметров прокси-сервера необходимо указать протокол, для которого устанавливаются параметры.
1 2 3 4 5 6 7 8 9 10 11 | &НаКлиенте Процедура HTTPЗапросЧерезПроксиИз1С(Команда) Прокси = Новый ИнтернетПрокси; Прокси.Установить("http", "hostname", 8000, "login", "password"); //Прокси.Установить("https", "hostname", 8000, "login", "password"); Соединение = Новый HTTPСоединение("example.com",,,,Прокси); Ответ = Соединение.Получить(Новый HTTPЗапрос); КонецПроцедуры |
Как установить заголовки в HTTP-запросе из 1С?
Установить заголовки HTTP-запроса может потребоваться в самых различных ситуациях, сделать это несложно.
1 2 3 4 5 6 7 8 9 10 | &НаКлиенте Процедура УстановкаЗаголовковВHTTPЗапросеИз1С(Команда) Соединение = Новый 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=1"); Ответ = Соединение.Получить(Новый HTTPЗапрос("", Заголовки)); КонецПроцедуры |
Как сохранить картинку или скачать файл с сайта HTTP-запросом из 1С?
Скачать файл/сохранить картинку при помощи HTTP-запроса из 1С совсем не сложно. В примере показано скачивание логотипа компании «1С» и два способа записи этого логотипа на диск.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | &НаКлиенте Процедура СохранитьКартинкуСкачатьФайлЧерезHTTPв1С(Команда) Соединение = Новый HTTPСоединение("static.1c.ru"); Запрос = Новый HTTPЗапрос("/images/logo.png"); ПутьДляСохранения = "C:\1.png"; //записываем на диск, так Ответ = Соединение.Получить(Запрос, ПутьДляСохранения); //либо так Ответ = Соединение.Получить(Запрос); Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ПутьДляСохранения); КонецПроцедуры |
Как послать POST-запрос из 1С?
POST-запросы отличаются от GET-запросов тем, что помимо заголовков могут содержать еще и тело. Именно поэтому в случаях, когда нужно отправить какую-то информацию на сайт (авторизация, файл, что-то еще) необходимо воспользоваться POST-запросом.
В качестве небольшого примера рассмотрим обращение с сервису проверки орфографии Яндекс.Спеллер через POST-запрос.
Отдельно отмечу заголовок application/x-www-form-urlencoded — он означает, что параметры в теле запроса кодируются в кортежах с ключом, разделенных символом «&», с «=» между ключом и значением. Если же в теле запроса требуется отправить двоичные данные, то в заголовке «Content-Type» следует указать multipart/form-data;boundary=»boundary» (вместо «boundary» можно выбрать другой разделитель). Достаточно неплохо про метод POST написано здесь.
Об отправке составных (multipart) HTTP-сообщений при помощи потоков можно прочитать в статье про двоичные данные.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | &НаКлиенте Процедура POSTЗапросИз1С(Команда) Соединение = Новый HTTPСоединение("speller.yandex.net",443,,,,,Новый ЗащищенноеСоединениеOpenSSL); ТекстНаПроверку = "Предложение с ашибкой"; Заголовки = Новый Соответствие; Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded"); Запрос = Новый HTTPЗапрос("/services/spellservice.json/checkText", Заголовки); Запрос.УстановитьТелоИзСтроки("text="+ТекстНаПроверку); Ответ = Соединение.ОтправитьДляОбработки(Запрос); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); Данные = ПрочитатьJSON(ЧтениеJSON, Ложь); КонецПроцедуры |
На этом все, надеюсь, что данная статья была Вам полезна.
Загрузка...
Добрый день
Есть ссылка http://sait2/pls/info/REESTR_PERSONS_TO_1C.run?rep_user=IVANOV&p_com=30274&p_reestr_format=xls&p_action=Пуск
При выполнении в браузере по ней открывается форма отчета и сразу формируется Exel файл
СерверИсточник = «sait2»;
Адрес = Новый HTTPЗапрос(«/pls/info/REESTR_PERSONS_TO_1C.run?rep_user=IVANOV&p_com=30274&p_reestr_format=xls&p_action=Пуск»);
ИмяВходящегоФайла = C:\1\1.xls;
НТТР = Новый HTTPСоединение(СерверИсточник);
НТТР.Получить(Адрес, ИмяВходящегоФайла);
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
При выполнении, в файл сохраняется только форма с параметрами, а не сам готовый отчет
Надо что бы при запуске из один 1С формировался файл отчета и сохранялся на диск
В чем может быть проблема?
Это ссылка на получение отчета из базы оракл и
и в базе так же происходит работа через internet explorer
может надо другим способом запускать формирование файла отчета?
Хорошая статья!
Огромнейшее Вам спасибо! Одна эта статья очень помогла решить сразу все проблемы вставшие при разработке системы интеграции с Яндекс.Заправки
Спасибо, статья помогла отправить POST-запрос из 1С
Дай я тебя обниму!
Спасибо за рабочий пример с POST запросом к Yandex Speller.
Очень помог!
Я даже готов тебя наградить премией!