Connector
Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
Install / Use
/learn @vbondarevsky/ConnectorREADME
Публикация на Инфостарт
The library is translated into English (README)
Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
В мире python очень популярна библиотека для работы с HTTP запросами - Requests (автор: Kenneth Reitz). Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п. В общем библиотека очень мощная и проста в использовании.
Коннектор - это "Requests" для мира 1С.
Бибилиотека полностью переведена на английский язык (см. здесь).
Возможности
Основные возможности библиотеки:
- Передача параметров в строку запроса (в URL)
- Удобная работа с запросами и ответами в формате
JSON - Отправка данных формы (полей формы),
application/x-www-form-urlencoded - Отправка данных формы (полей формы и файлов),
multipart/form-data - Прозрачная поддержка ответов, закодированных
GZip - Сжатие тела запроса
GZip Basic,DigestиAWS4-HMAC-SHA256аутентификация- Автоматическое разрешение редиректов
- Установка и чтение Cookies
- Работа в рамках сессии с сохранением состояния (cookies, аутентификация и пр.)
- Переиспользование
HTTPСоединениев рамках сессии - Настраиваемые повторные попытки соединения/отправки запроса с экспоненциальной задержкой
- Работает в т.ч. и на мобильной платформе
- И многое другое
Требования
- Платформа 8.3.10 и выше.
- Мобильная платформа (проверено только на 8.3.15)
Использование
Скопируйте общий модуль к себе в конфигурацию.
Пример мощи библиотеки
Чем же хороша библиотека? Давай уже покажи пример.
Получим данные 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
И это достаточно простой пример. Всю мощь библиотеки рассмотрим далее.
Передача параметров в строку запроса (в URL)
Работать с параметрами запроса очень просто:
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("name", СтрРазделить("Иванов,Петров", ","));
ПараметрыЗапроса.Вставить("salary", Формат(100000, "ЧГ="));
Ответ = КоннекторHTTP.GetJson("https://httpbin.org/anything/params", ПараметрыЗапроса);
Поддерживается передача нескольких значений для одного параметра, достаточно указать в качестве значения Массив (см. name).
Параметры можно задать:
- Явно в URL
- Передать в параметре
ПараметрыЗапроса - Скомбинировать оба варианта
Результат будет один и тот же:
- Коннектор подставит параметры в URL в виде пар ключ=значение
- Закодирует строку URL, используя
URLEncoding - Выполнит запрос
Итоговое значение URL можно получить из свойства ответа URL
Ответ = КоннекторHTTP.Get("https://httpbin.org/anything/params", ПараметрыЗапроса);
Ответ.URL - https://httpbin.org/anything/params?name=%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2&name=%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2&salary=100000
Произвольные HTTP заголовки
В основных сценариях использования библиотеки заголовки формируются автоматически.
При необходимости произвольные заголовки можно задать через параметр ДополнительныеПараметры, свойство Заголовки.
Заголовки = Новый Соответствие;
Заголовки.Вставить("X-My-Header", "Hello!!!");
Результат = КоннекторHTTP.GetJson("http://httpbin.org/headers", Неопределено, Новый Структура("Заголовки", Заголовки));
Работа с JSON
Для облегчения работы с 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.Post("https://httpbin.org/post", Неопределено, Новый Структура("Файлы", Файлы));
Файл будет закодирован в теле запроса, заголовку Content-Type автоматически установлено значение multipart/form-data.
Отправка файлов и данных формы
Для отправки данных формы и файлов в одном запросе нужно сформировать описание файлов и данных формы и передать их в параметрах ДополнительныеПараметры.Файлы, ДополнительныеПараметры.Данные.
Файлы = Новый Массив;
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f1", Base64Значение("ZmlsZTE="), "file1.txt"));
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f2", Base64Значение("ZmlsZTI="), "file2.txt"));
Данные = Новый Структура("field1,field2", "value1", "Значение2");
Результат = КоннекторHTTP.Post("https://httpbin.org/post", Неопределено, Новый Структура("Файлы,Данные", Файлы, Данные));
Файлы и данные формы будут закодированы в теле запроса, заголовку Content-Type автоматически установлено значение multipart/form-data.
Отправка произвольных данных
Чтобы отправить произвольные данные (Строка, ДвоичныеДанные) их нужно передать в параметре Данные.
XML =
"<?xml version=""1.0"" encoding=""utf-8""?>
|<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
| <soap:Body>
| <GetCursOnDate xmlns=""http://web.cbr.ru/"">
| <On_date>2019-07-05</On_date>
| </GetCursOnDate>
| </soap:Body>
|</soap:Envelope>";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Заголовки.Вставить("SOAPAction", "http://web.cbr.ru/GetCursOnDate");
Ответ = КоннекторHTTP.Post(
"https://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx",
XML,
Новый Структура("Заголовки", Заголовки));
Содержимое ответа
Методы, которые не заканчиваются на Json, возвращают ответ в виде Структура:
ВремяВыполнения- Число - время выполнения запроса в миллисекундахCookies- cookies полученные с сервераЗаголовки- HTTP заголовки ответаЭтоПостоянныйРедирект- признак постоянного редиректаЭтоРедирект- признак редиректаКодировка- кодировка текста ответаТело- тело ответаКодСостояния- код состояния ответаURL- итоговый URL, по которому был выполнен запрос
Получить данные из ответа в виде JSON, текста или двоичных данных можно с помощью соответствующих методов, описанных ниже.
Чтение ответа как JSON
Получить данные из ответа в виде десериализованного JSON можно с помощью метода КакJson.
Результат = КоннекторHTTP.КакJson(КоннекторHTTP.Get("http://httpbin.org/get"));
Чтение ответа как Текст
Получить данные из ответа в виде текста можно с помощью метода КакТекст.
Результат = КоннекторHTTP.КакТекст(КоннекторHTTP.Get("http://httpbin.org/encoding/utf8"));
При этом можно указать кодировку в соответствующем параметре. Если параметр не указан, то Коннектор возьмет значение кодировки из заголовков (если она там есть).
Чтение ответа как ДвоичныеДанные
Метод КакДвоичныеДанные преобразует ответ в ДвоичныеДанные.
Результат = КоннекторHTTP.КакДвоичныеДанные(КоннекторHTTP.Get("http://httpbin.org/image/png"));
Чтение ответа XML как XDTO
Метод КакXDTO преобразует ответ XML в ОбъектXDTO.
Результат = КоннекторHTTP.КакXDTO(Ответ);
`
