14 KiB
Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
В мире python очень популярна библиотека для работы с HTTP запросами - Requests (автор: Kenneth Reitz). Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п. В общем библиотека очень мощная и проста в использовании.
Коннектор - это "Requests" для мира 1С.
Требования
Платформа 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");
Все! В Результат
будут данные в структуре.
При этом библиотека сама разбила URL на составляющие, установила защищенное соединение, порт. Определила кодировку ответа из заголовков и десериализовала JSON. И это достаточно простой пример. Всю мощь библиотеки рассмотрим далее от простого к сложному.
Возможности
- JSON TODO
Для GET
, OPTIONS
, HEAD
, POST
, PUT
, PATCH
, DELETE
есть соответствующие методы.
Или любой другой из HTTP-методов через вызов КоннекторHTTP.ВызватьМетод
Передача параметров в строку запроса (в 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", ПараметрыЗапроса);
Содержимое ответа
Почти все методы возвращают ответ в виде Структура
:
- список TODO
Также имеются специальные методы, которые позволяют получить ответ в виде JSON, текста или двоичных данных.
JSON
Для GET
предусмотрен метод GetJson
, который сразу возвращает результат в виде Json.
Результат = КоннекторHTTP.GetJson("http://httpbin.org/get");
Результат вызова всех остальных методов можно легко преобразовать в 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"));
Произвольные заголовки
TODO: в типовых сценариях заголовки подставляются автоматически
Произвольные заголовки можно задать через параметр ДополнительныеПараметры
Заголовки = Новый Соответствие;
Заголовки.Вставить("X-My-Header", "Hello!!!");
Результат = КоннекторHTTP.GetJson("http://httpbin.org/headers",, Новый Структура("Заголовки", Заголовки));
Отправка данных формы
Отправить данные формы очень просто.
Передаем наши данные (Структура
или Соответствие
) в метод 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
.
Отправка JSON
Передаем данные Структура
или Соответствие
Json = Новый Структура;
Json.Вставить("Сотрудник", "Иванов Иван Петрович");
Json.Вставить("Должность", "Разнорабочий");
в параметр Json
метода POST
Ответ = КоннекторHTTP.Post("http://httpbin.org/post",, Json);
или в свойство Json
параметра ДополнительныеПараметры
для всех методов отправки данных
Ответ = КоннекторHTTP.Put("http://httpbin.org/put",, Новый Структура("Json", Json));
Данные будут сериализованы в JSON, установлен заголовок application/json
.
Упрощенная работа с 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 a Multipart-Encoded File
POST Multiple Multipart-Encoded Files
Response Status Codes
Response Headers
Таймаут
Ответ = КоннекторHTTP.Get("https://httpbin.org/delay/10",, Новый Структура("Таймаут", 1));
Значение по умолчанию - 30 сек.
Basic-аутентификация
Параметры 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-аутентификации можно передать через свойство ДополнительныеПараметры.Аутентификация
.
При этом Тип
нужно установить в значение Digest
.
Аутентификация = Новый Структура("Пользователь, Пароль, Тип", "user", "pass", "Digest");
Результат = КоннекторHTTP.GetJson(
"https://httpbin.org/digest-auth/auth/user/pass",,
Новый Структура("Аутентификация", Аутентификация));
GZip-кодирование
По умолчанию Коннектор просит сервер кодировать ответы в формате GZip
.
Декодирование выполняется прозрачным образом в методах GetJson
, PostJson
, PutJson
, DeleteJson
, КакJson
, КакТекст
, КакДвоичныеДанные
.
Результат = КоннекторHTTP.GetJson("http://httpbin.org/gzip");
Доступ через прокси-сервер
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "192.168.1.51", 8192);
КоннекторHTTP.GetJson("http://httpbin.org/headers",,, Новый Структура("Прокси", Прокси));
Если в конфигурации используется БСП
, то настройки прокси по умолчанию берутся из БСП
.
Cookies
Редиректы (Перенапраления)
Коннектор по умолчанию автоматически разрешает редиректы. Например, попробуем получить результат поиска в Яндексе (http://ya.ru).
Результат = КоннекторHTTP.Get("http://ya.ru/", Новый Структура("q", "удаление кеша метаданных инфостарт"));
Что по факту произойдет при выполнении этого запроса:
- сервер попросит выполнить запрос используя
https
, т.е. код статуса 302 и значение заголовкаLocation
https://ya.ru/?q=... - Коннектор выполнит перезапрос, используя схему
https
- сервер попросит выполнить запрос, используя https://yandex.ru ....
- Коннектор выполнит перезапрос, используя URL ...
- сервер наконец-то вернет результат в виде
html
Отключить автоматический редирект можно с помощью параметра ДополнительныеПараметры.РазрешитьПеренаправление
.
Errors and Exceptions
Session Objects
TODO: можно пример получения списка обновлений с сайта 1С с авторизацией https://infostart.ru/public/255881/