Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
Программирование - Инструментарий
http post get cookie ssl url multipart/form-data x-www-form-urlencoded gzip cookie редирект digest дайджест аутентификация https
Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
В мире python очень популярна библиотека для работы с HTTP запросами - Requests (автор: Kenneth Reitz). Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п. В общем библиотека очень мощная и проста в использовании.
Коннектор - это "Requests" для мира 1С.
Возможности
Основные возможности библиотеки:
- Передача параметров в строку запроса (в URL)
- Удобная работа с запросами и ответами в формате
JSON
- Отправка данных формы (полей формы),
application/x-www-form-urlencoded
- Отправка данных формы (полей формы и файлов),
multipart/form-data
- Прозрачная поддержка ответов, закодированных
GZip
Basic
иDigest
аутентификация- Автоматическое разрешение редиректов
- Установка и чтение Cookies
- Работа в рамках сессии с сохранением состояния (cookies, аутентификация и пр.)
- И многое другое
Требования
Платформа 8.3.10 и выше.
Использование
Скопируйте общий модуль к себе в конфигурацию.
Пример мощи библиотеки
Чем же хороша библиотека? Давай уже покажи пример.
Получим данные JSON
с помощью GET
-запроса:
Вот так это делается стандартными средствами 1С
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровОС);
Соединение = Новый HTTPСоединение("api.github.com", 443,,,, 30, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/events");
Ответ = Соединение.Получить(Запрос);
Поток = Ответ.ПолучитьТелоКакПоток();
Кодировка = "utf-8"; // ну допустим мы знаем что там такая кодировка
Ридер = Новый ЧтениеJSON;
Ридер.ОткрытьПоток(Поток, Кодировка); // Кодировка в заголовке ответа
Результат = ПрочитатьJSON(Ридер);
Ридер.Закрыть();
А вот так с помощью Коннектора
Результат = КоннекторHTTP.GetJson("https://api.github.com/events");
Все! В Результат
будет десериализованный из JSON
ответ сервера. При этом:
- Библиотека сама разбила URL на составляющие
- Установила защищенное соединение
- Определила кодировку ответа из заголовков
- Десериализовала
JSON
И это достаточно простой пример. Всю мощь библиотеки рассмотрим далее.
Работать с параметрами запроса очень просто:
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("name", СтрРазделить("Иванов,Петров", ","));
ПараметрыЗапроса.Вставить("salary", Формат(100000, "ЧГ="));
Ответ = КоннекторHTTP.GetJson("https://httpbin.org/anything/params", ПараметрыЗапроса);
Поддерживается передача нескольких значений для одного параметра, достаточно указать в качестве значения Массив
(см. name
).
Параметры можно задать:
- Явно в URL
- Передать в параметре
ПараметрыЗапроса
- Скомбинировать оба варианта
Результат будет один и тот же:
- Коннектор подставит параметры в URL в виде пар ключ=значение
- Закодирует строку URL, используя
URLEncoding
- Выполнит запрос
Итоговое значение URL можно получить из свойства ответа URL
Ответ = КоннекторHTTP.Get("https://httpbin.org/anything/params", ПараметрыЗапроса);
В основных сценариях использования библиотеки заголовки формируются автоматически. При необходимости произвольные заголовки можно задать через параметр ДополнительныеПараметры
, свойство Заголовки
.
Заголовки = Новый Соответствие;
Заголовки.Вставить("X-My-Header", "Hello!!!");
Результат = КоннекторHTTP.GetJson("http://httpbin.org/headers",, Новый Структура("Заголовки", Заголовки));
Для облегчения работы с JSON есть методы: GetJson
, PostJson
, PutJson
, DeleteJson
. Запросы отправляются в формате JSON, ответы - JSON прочитанный в Соответствие
/Структура
.
Результат = КоннекторHTTP.GetJson("http://httpbin.org/get");
Результат = КоннекторHTTP.PostJson("http://httpbin.org/post", Новый Структура("Название", "КоннекторHTTP"));
Результат = КоннекторHTTP.PutJson("http://httpbin.org/put", Новый Структура("Название", "КоннекторHTTP"));
Результат = КоннекторHTTP.DeleteJson("http://httpbin.org/delete", Новый Структура("Название", "КоннекторHTTP"));
Сериализация в JSON и десериализация из JSON настраиваются с помощью параметров в ДополнительныеПараметры.ПараметрыПреобразованияJSON
.
Отправить данные формы очень просто. Передаем данные (Структура
или Соответствие
) в метод POST
и все.
Данные = Новый Структура;
Данные.Вставить("comments", "Постучать в дверь");
Данные.Вставить("custemail", "vasya@mail.ru");
Данные.Вставить("custname", "Вася");
Данные.Вставить("custtel", "112");
Данные.Вставить("delivery", "20:20");
Данные.Вставить("size", "medium");
Данные.Вставить("topping", СтрРазделить("bacon,mushroom", ","));
Ответ = КоннекторHTTP.Post("http://httpbin.org/post", Данные);
Данные будут закодированы, заголовку Content-Type
автоматически будет установлено значение application/x-www-form-urlencoded
.
Для отправки файла нужно сформировать описание файла и передать его в параметр ДополнительныеПараметры.Файлы
.
Файлы = Новый Структура;
Файлы.Вставить("Имя", "f1");
Файлы.Вставить("ИмяФайла", "file1.txt");
Файлы.Вставить("Данные", Base64Значение("0J/RgNC40LLQtdGCINCc0LjRgCE="));
Файлы.Вставить("Тип", "text/plain");
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post",, Новый Структура("Файлы", Файлы));
Файл будет закодирован в теле запроса, заголовку Content-Type
автоматически установлено значение multipart/form-data
.
Для отправки данных формы и файлов в одном запросе нужно сформировать описание файлов и данных формы и передать их в параметрах ДополнительныеПараметры.Файлы
, ДополнительныеПараметры.Данные
.
Файлы = Новый Массив;
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f1", Base64Значение("ZmlsZTE="), "file1.txt"));
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f2", Base64Значение("ZmlsZTI="), "file2.txt"));
Данные = Новый Структура("field1,field2", "value1", "Значение2");
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post",, Новый Структура("Файлы,Данные", Файлы, Данные));
Файлы и данные формы будут закодированы в теле запроса, заголовку Content-Type
автоматически установлено значение multipart/form-data
.
Методы, которые не заканчиваются на Json, созвращают ответ в виде Структура
:
ВремяВыполнения
- Число - время выполнения запроса в миллисекундахCookies
- cookies полученные с сервераЗаголовки
- HTTP заголовки ответаЭтоПостоянныйРедирект
- признак постоянного редиректаЭтоРедирект
- признак редиректаКодировка
- кодировка текста ответаТело
- тело ответаКодСостояния
- код состояния ответаURL
- итоговый URL, по которому был выполнен запрос
Получить данные из ответа в виде JSON, теста или двоичных данных можно с помощью соответствующих методов, описанных ниже.
Чтение ответа как JSON
Получить данные из ответа в виде десериализованного JSON можно с помощью метода КакJson
.
Результат = КоннекторHTTP.КакJson(КоннекторHTTP.Post(("http://httpbin.org/get")));
Чтение ответа как Текст
Получить данные из ответа в виде текста можно с помощью метода КакТекст
.
Результат = КоннекторHTTP.КакТекст(КоннекторHTTP.Get("http://httpbin.org/encoding/utf8"));
При этом можно указать кодировку в соответствующем параметре. Если параметр не указан, то Коннекторвозьмет значение кодировки из заголовков (если она там есть).
Чтение ответа как ДвоичныеДанные
Метод КакДвоичныеДанные
преобразует ответ в ДвоичныеДанные
.
Результат = КоннекторHTTP.КакДвоичныеДанные(КоннекторHTTP.Get("http://httpbin.org/image/png"));
По умолчанию Коннектор просит сервер кодировать ответы в формате GZip
. Декодирование выполняется прозрачным образом в методах GetJson
, PostJson
, PutJson
, DeleteJson
, КакJson
, КакТекст
, КакДвоичныеДанные
.
Результат = КоннекторHTTP.GetJson("http://httpbin.org/gzip");
Таймаут можно задать в параметре ДополнительныеПараметры.Таймаут
.
Ответ = КоннекторHTTP.Get("https://httpbin.org/delay/10",, Новый Структура("Таймаут", 1));
Значение по умолчанию - 30 сек.
Параметры Basic-аутентификации можно передать в параметре ДополнительныеПараметры.Аутентификация
Аутентификация = Новый Структура("Пользователь, Пароль", "user", "pass");
Результат = КоннекторHTTP.GetJson(
"https://httpbin.org/basic-auth/user/pass",,
Новый Структура("Аутентификация", Аутентификация));
или в URL
Результат = КоннекторHTTP.GetJson("https://user:pass@httpbin.org/basic-auth/user/pass");
Параметры Digest-аутентификации можно передать в параметре ДополнительныеПараметры.Аутентификация
. При этом Тип
нужно установить в значение Digest
.
Аутентификация = Новый Структура("Пользователь, Пароль, Тип", "user", "pass", "Digest");
Результат = КоннекторHTTP.GetJson(
"https://httpbin.org/digest-auth/auth/user/pass",,
Новый Структура("Аутентификация", Аутентификация));
Настройки прокси можно передать в параметре ДополнительныеПараметры.Прокси
.
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "192.168.1.51", 8192);
КоннекторHTTP.GetJson("http://httpbin.org/headers",,, Новый Структура("Прокси", Прокси));
Если в конфигурации используется БСП
, то настройки прокси по умолчанию берутся из БСП
.
Для GET
, OPTIONS
, HEAD
, POST
, PUT
, PATCH
, DELETE
есть соответствующие методы. Для любого из HTTP-методов можно отправить запрос через вызов метода ВызватьМетод
.
Коннектор по умолчанию автоматически разрешает редиректы. Например, попробуем получить результат поиска в Яндексе (http://ya.ru).
Результат = КоннекторHTTP.Get("http://ya.ru/", Новый Структура("q", "удаление кеша метаданных инфостарт"));
Что по факту произойдет при выполнении этого запроса:
- Коннектор выполнит запрос к URL http://ya.ru/
- Сервер попросит выполнить запрос используя
https
, т.е. вернет код статуса302
и значение заголовкаLocation
=https://ya.ru/?q=...
- Коннектор выполнит перезапрос, используя схему
https
- Cервер попросит выполнить запрос, используя другой URL, т.е. вернет код статуса
302
и значение заголовкаLocation
=https://yandex.ru/search/?text=...
- Коннектор выполнит перезапрос, используя URL
https://yandex.ru/search/?text=...
- Cервер наконец-то вернет результат в виде
html
Отключить автоматический редирект можно с помощью параметра ДополнительныеПараметры.РазрешитьПеренаправление
.
Нужно ли проверять сертификат сервера и какие корневые сертификаты для этого использовать можно задать через параметр ДополнительныеПараметры.ПроверятьSSL
.
Результат = КоннекторHTTP.Get("https://my_super_secret_server.ru/", Новый Структура("ПроверятьSSL", Ложь));
Клиентский сертификат можно задать через параметр ДополнительныеПараметры.КлиентскийСертификатSSL
.
КлиентскийСертификатSSL = Новый СертификатКлиентаФайл("my_cert.p12", "123");
Результат = КоннекторHTTP.Get("https://my_super_secret_server.ru/", Новый Структура("КлиентскийСертификатSSL", КлиентскийСертификатSSL));
Коннектор извлекает cookies из заголовков Set-Cookie
ответа сервера для дальнейшего использования. Полученные cookies можно посмотреть в свойстве ответа Cookies
.
Передать произвольные cookies на сервер можно с помощью параметра ДополнительныеПараметры.Cookies
.
Cookies = Новый Массив;
Cookies.Добавить(Новый Структура("Наименование,Значение", "k1", Строка(Новый УникальныйИдентификатор)));
Cookies.Добавить(Новый Структура("Наименование,Значение", "k2", Строка(Новый УникальныйИдентификатор)));
Ответ = КоннекторHTTP.Get("http://httpbin.org/cookies",, Новый Структура("Cookies", Cookies));
Коннектор позволяет работать с сервером в рамках сессии, т.е. сохраняет состояние на клиенте между вызовами.
Например, попробуем получить с сайта releases.1c.ru список обновлений.
Сессия = КоннекторHTTP.СоздатьСессию();
Ответ = КоннекторHTTP.ВызватьМетодВСеансе(Сессия, "GET", "https://releases.1c.ru/total");
Данные = Новый Структура;
Данные.Вставить("execution", ИзвлечьExecution(Ответ));
Данные.Вставить("username", Константы.Логин.Получить());
Данные.Вставить("password", Константы.Пароль.Получить());
Данные.Вставить("_eventId", "submit");
Данные.Вставить("geolocation", "");
Данные.Вставить("submit", "Войти");
Данные.Вставить("rememberMe", "on");
Ответ = КоннекторHTTP.ВызватьМетодВСеансе(Сессия, "POST", Ответ.URL, Новый Структура("Данные", Данные));
Что при этом произойдет:
- Коннектор выполнит
GET
запрос к URLhttps://releases.1c.ru/total
- Сервер попросит выполнить запрос к URL
https://login.1c.ru/login?service=https%3A%2F%2Freleases.1c.ru%2Fpublic%2Fsecurity_check
- Коннектор сохранит полученные cookies и выполнит
GET
запрос к URLhttps://releases.1c.ru/total
- Сервер вернет форму, в которой нужно авторизоваться
- Извлечем данные из формы и отправим из на сервер вместе с нашим логином и паролем
- Коннектор выполнит
POST
запрос и отправит данные формы и ранее полученные cookies - Сервер проверит параметры формы и если все хорошо, то выдаст тикет и попросит выполнить запрос к URL
https://releases.1c.ru/total
- Коннектор выполнит
GET
запрос к URLhttps://releases.1c.ru/total
и передаст установленные ранее cookies - Сервер вернут нужный нам результат в виде
html
Далее используя Сессия
можно выполнять запросы к серверу и скачивать обновления.
Скачать файлы
Наименование | Файл | Версия | Размер | |||
---|---|---|---|---|---|---|
Коннектор: удобный HTTP-клиент для 1С:Предприятие 8:
.cf 29,86Kb
30.01.19
72
|
.cf | 1.1.3 | 29,86Kb | 72 | Скачать |
См. также
Специальные предложения
Вот ребята пишут что нельзя.
А имеет большой смысл привязываться к 8.3.10? Да, работа с потоками эффективна с т.зр. расходования памяти, но если убрать потоки можно расширить количество конфигураций, на которых библиотеку можно применять.
Очень вовремя, а то писал какие-то свои реализации частных случаев.
Подскажите, может есть на Python библиотека для "другой стороны"? Я, в основном, на 1С делаю http-сервисы, так же была идея как-то унифицировать обработку входящих запросов, возврат значений и ошибок, webhook'и, подписки.
Их там много. В самом python более богатые средства работы с HTTP, чем в 1С.
Самый простой Bottle
Вопрос: а нет ли библиотеки, которая разбирает фильтры OData в какой-нибудь удобный вид?
Надо делать хттп-сервис в 1с, который бы поддерживал базовые фильтры в стиле OData. Наверняка это уже где-то сделано.
Объект = ПрочитатьJSON(
по причине:
Непредвиденный символ при чтении JSON
А вот , что выдаёт в ответе PostMan
{
"Успех": true,
"ФИО": {
"Фамилия": "Пупкин",
"Имя": "Африкан",
"Отчество": "Свиридович"
},
"ДР": "2013-03-18T09:53:27",
"Дети": [
"Вася",
"Лена"
]
}
ПоказатьА вот код, собирающий ответ
Кодировка = "UTF-8";
ЗаписьJSON = Новый ЗаписьJSON();
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(ЗаписьJSON, Данные);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, Кодировка, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
ПоказатьЧто не так ?
Спасибо.
Полдела есть "<title>IIS 10.0 Detailed Error - 401.5 - Unauthorized</title> "
Вот код
Аутентификация = Новый Структура("Пользователь, Пароль", "1cuser", "1cparol");
Ответ = КоннекторHTTP.Get("http://111.222.333.444/base/hs/service/Test", Новый Структура("Аутентификация", Аутентификация));
Сообщить(Ответ.КодСостояния);
Вызов же вроде верный.
Только у меня GET возвращает корректные данные.
в описании API
....
Client : Работа с клиентами Show/Hide List Operations Expand Operations
GET /client Получение списка клиентов
POST /client Создание клиента
GET /client/{id} Получение клиент по ID
PUT /client/{id} Обновление клиента по ID
Но ошибка явно кроется в том, что отвечает сервер об ошибке.
В отладчике:
Ответ.КодСостояния = 500
Ответ.Тело= 43 44 62 43 6F 6D ... ДвоичныеДанные
В теле ответа есть двоичные данные. Очевидно там сервер пишет о своей проблеме в виде строки.
Я бы поправил
Объект = ПрочитатьJSON(...)
через попытку.
Если вышло исключение , то вернуть тело как строку (затолкнув ее в структуру для совместимости типов возвращаемых значений этой функции).
Проще говоря: не всегда на /POST приходит ответ в том, в чем отправили))
Вообще, безопасный алгоритм такой:
Ответ = КоннецкторHTTP.Post();
Если Ответ.КодСостояния = 200 Тогда // Зависит от сервиса, где-то и на ошибки возвращать будут JSON
Результат = КоннекторHTTP.КакJson(Ответ);
Иначе
ВызватьИсключение(КоннекторHTTP.КакТекст(Ответ));
КонецЕсли;
Именно так.
Я не совсем понятно описал суть:
Результат =КоннекторHTTP.PostJson("http://demo1.aut............./call",Содержимое,Новый Структура("Аутентификация", ПараметрыЗапроса));
Если Результат.Получить("success") Тогда
.....
....
Иначе
Для Каждого ЗаписьОтвета Из Результат.Получить("errors") Цикл
.......
.......
PostJson не всегда возвращает ожидаемый результат.
Бывают ситуации, когда сервер вернет не 200, а кодСостояния =500 (да много их там), то тело будет содержать в себе не Json, а текст (или xml).
Ошибка возникает именно в строке 1502 , как писали в (32)
Использую
Результат =КоннекторHTTP.PostJson("http://demo1.auXXXXXXX",Содержимое,Новый Структура("Аутентификация", ПараметрыЗапроса));
Если Результат.Получить("success") Тогда
...
Иначе
Для Каждого ЗаписьОтвета Из Результат.Получить("errors") Цикл
...
Не всегда ответ содержит именно Json. И ошибка в модуле коннектора стр. 1503 как писали в (32).
Я в (41) предложил)
Пробовал так:
П
араметрыЗапроса = Новый Структура;
СтруктураСортировка = Новый Соответствие;
СтруктураСортировка .Вставить("updated_at ",3);
ПараметрыЗапроса.Вставить("sort", СтруктураСортировка );
Поправил ошибку.
Должно работать так:
ПараметрыЗапроса = Новый Соответствие;
ПараметрыЗапроса.Вставить("sort[updated_at]", "3");
Ответ = КоннекторHTTP.Get("http://direct.ru/lead/25/list", ПараметрыЗапроса);

Просмотры 5331
Загрузки 69
Комментарии 44
Создание 31.01.19 00:26
Обновление 08.02.19 13:04
№ Публикации 709325
Рубрики
Практика программирования,
Обмен с другими системами,
Интеграция с WEB,
Универсальные функции Инструментарий,
Универсальные обработки
Кому Программист
Тип файла Конфигурация (md, cf)
Платформа Платформа 1С v8.x (все механизмы)
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Раздел учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да
Любые узлы, Любые отборы, Несколько уровней регистрации, Просмотр данных для регистрации и многое другое. Есть ДЕМО-версии! Скидки постоянным клиентам!
|
