2019-01-30 23:43:56 +02:00
Публикация на [Инфостарт ](https://infostart.ru/public/709325/ )
2019-01-15 14:27:31 +02:00
# Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
2019-01-28 17:15:44 +02:00
В мире python очень популярна библиотека для работы с HTTP запросами - [Requests ](http://docs.python-requests.org/en/master ) (автор: Kenneth Reitz).
2019-01-15 14:27:31 +02:00
Библиотека берет на себя всю рутину работы с HTTP запросами.
Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.
В общем библиотека очень мощная и проста в использовании.
2019-01-28 17:15:44 +02:00
**Коннектор** - это "Requests" для мира 1С.
2019-01-15 14:27:31 +02:00
2019-01-30 18:36:00 +02:00
## Возможности
Основные возможности библиотеки:
- Передача параметров в строку запроса (в URL)
- Удобная работа с запросами и ответами в формате `JSON`
- Отправка данных формы (полей формы), `application/x-www-form-urlencoded`
- Отправка данных формы (полей формы и файлов), `multipart/form-data`
- Прозрачная поддержка ответов, закодированных `GZip`
2019-10-13 03:22:22 +02:00
- `Basic` , `Digest` и `AWS4-HMAC-SHA256` аутентификация
2019-01-30 18:36:00 +02:00
- Автоматическое разрешение редиректов
- Установка и чтение Cookies
- Работа в рамках сессии с сохранением состояния (cookies, аутентификация и пр.)
2019-10-13 03:22:22 +02:00
- Переиспользование `HTTPСоединение` в рамках сессии
2019-01-30 18:36:00 +02:00
- И многое другое
2019-01-17 00:35:20 +02:00
## Требования
2019-01-30 18:36:00 +02:00
Платформа **8.3.10** и выше.
2019-01-17 00:35:20 +02:00
## Использование
2019-01-30 18:36:00 +02:00
Скопируйте общий модуль к себе в конфигурацию.
2019-01-17 00:35:20 +02:00
2019-01-30 18:39:26 +02:00
## Пример мощи библиотеки
2019-01-28 20:10:14 +02:00
*Чем же хороша библиотека? Давай уже покажи пример.*
2019-01-15 14:27:31 +02:00
2019-01-30 18:36:00 +02:00
Получим данные `JSON` с помощью `GET` -запроса:
2019-01-15 14:27:31 +02:00
2019-01-30 18:36:00 +02:00
Вот так это делается стандартными средствами 1С
2019-01-15 14:27:31 +02:00
```bsl
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровОС);
Соединение = Новый HTTPСоединение("api.github.com", 443,,,, 30, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/events");
Ответ = Соединение.Получить(Запрос);
2019-01-30 18:36:00 +02:00
Поток = Ответ.ПолучитьТелоКакПоток();
2019-01-15 14:27:31 +02:00
Кодировка = "utf-8"; // ну допустим мы знаем что там такая кодировка
Ридер = Новый ЧтениеJSON;
Ридер.ОткрытьПоток(Поток, Кодировка); // Кодировка в заголовке ответа
2019-01-30 18:36:00 +02:00
Результат = ПрочитатьJSON(Ридер);
Ридер.Закрыть();
2019-01-15 14:27:31 +02:00
```
2019-01-30 18:36:00 +02:00
А вот так с помощью **Коннектора**
2019-01-15 14:27:31 +02:00
```bsl
2019-01-28 20:10:14 +02:00
Результат = КоннекторHTTP.GetJson("https://api.github.com/events");
2019-01-15 14:27:31 +02:00
```
2019-01-30 18:36:00 +02:00
Все! В `Результат` будет десериализованный из `JSON` ответ сервера.
При этом:
- Библиотека сама разбила URL на составляющие
- Установила защищенное соединение
- Определила кодировку ответа из заголовков
- Десериализовала `JSON`
И это достаточно простой пример. Всю мощь библиотеки рассмотрим далее.
2019-01-15 14:27:31 +02:00
## Передача параметров в строку запроса (в URL)
2019-01-17 02:24:05 +02:00
Работать с параметрами запроса очень просто:
2019-01-15 14:27:31 +02:00
```bsl
ПараметрыЗапроса = Новый Структура;
2019-01-17 02:24:05 +02:00
ПараметрыЗапроса.Вставить("name", СтрРазделить("Иванов,Петров", ","));
ПараметрыЗапроса.Вставить("salary", Формат(100000, "ЧГ="));
2019-01-15 14:27:31 +02:00
2019-01-30 18:36:00 +02:00
Ответ = КоннекторHTTP.GetJson("https://httpbin.org/anything/params", ПараметрыЗапроса);
2019-01-17 02:24:05 +02:00
```
2019-01-30 18:36:00 +02:00
Поддерживается передача нескольких значений для одного параметра, достаточно указать в качестве значения `Массив` (см. `name` ).
2019-01-17 02:24:05 +02:00
Параметры можно задать:
2019-01-30 18:36:00 +02:00
- Явно в URL
- Передать в параметре `ПараметрыЗапроса`
2019-01-17 02:24:05 +02:00
- Скомбинировать оба варианта
Результат будет один и тот же:
2019-01-30 18:36:00 +02:00
- Коннектор подставит параметры в URL в виде пар ключ=значение
- Закодирует строку URL, используя `URLEncoding`
2019-01-17 02:24:05 +02:00
- Выполнит запрос
2019-01-30 18:36:00 +02:00
Итоговое значение URL можно получить из свойства ответа `URL`
2019-01-17 02:24:05 +02:00
```bsl
2019-01-15 14:27:31 +02:00
Ответ = КоннекторHTTP.Get("https://httpbin.org/anything/params", ПараметрыЗапроса);
```
2019-01-30 18:36:00 +02:00
`Ответ.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
2019-01-18 12:05:36 +02:00
2019-01-30 18:36:00 +02:00
## Произвольные HTTP заголовки
В основных сценариях использования библиотеки заголовки формируются автоматически.
При необходимости произвольные заголовки можно задать через параметр `ДополнительныеПараметры` , свойство `Заголовки` .
2019-01-18 12:05:36 +02:00
```bsl
2019-01-30 18:36:00 +02:00
Заголовки = Новый Соответствие;
Заголовки.Вставить("X-My-Header", "Hello!!!");
2019-10-13 03:22:22 +02:00
Результат = КоннекторHTTP.GetJson("http://httpbin.org/headers", Неопределено, Новый Структура("Заголовки", Заголовки));
2019-01-18 12:05:36 +02:00
```
2019-01-30 18:36:00 +02:00
## Работа с JSON
Для облегчения работы с JSON есть методы:
`GetJson` , `PostJson` , `PutJson` , `DeleteJson` .
Запросы отправляются в формате JSON, ответы - JSON прочитанный в `Соответствие` /`Структура`.
2019-01-18 12:05:36 +02:00
```bsl
2019-01-30 18:36:00 +02:00
Результат = Коннектор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"));
2019-01-18 12:05:36 +02:00
```
2019-01-15 14:27:31 +02:00
2019-01-30 18:36:00 +02:00
Сериализация в JSON и десериализация из JSON настраиваются с помощью параметров в `ДополнительныеПараметры.ПараметрыПреобразованияJSON` .
2019-01-17 00:35:20 +02:00
2019-01-21 04:32:59 +02:00
## Отправка данных формы
Отправить данные формы очень просто.
2019-01-30 18:36:00 +02:00
Передаем данные (`Структура` или `Соответствие` ) в метод `POST` и все.
2019-01-21 04:32:59 +02:00
```bsl
Данные = Новый Структура;
Данные.Вставить("comments", "Постучать в дверь");
Данные.Вставить("custemail", "vasya@mail.ru");
Данные.Вставить("custname", "Вася");
Данные.Вставить("custtel", "112");
Данные.Вставить("delivery", "20:20");
Данные.Вставить("size", "medium");
Данные.Вставить("topping", СтрРазделить("bacon,mushroom", ","));
Ответ = КоннекторHTTP.Post("http://httpbin.org/post", Данные);
```
2019-01-30 18:36:00 +02:00
Данные будут закодированы, заголовку `Content-Type` автоматически будет установлено значение `application/x-www-form-urlencoded` .
2019-01-21 04:32:59 +02:00
2019-01-30 18:36:00 +02:00
## Отправка файла
Для отправки файла нужно сформировать описание файла и передать его в параметр `ДополнительныеПараметры.Файлы` .
2019-01-21 04:32:59 +02:00
```bsl
2019-01-30 18:36:00 +02:00
Файлы = Новый Структура;
Файлы.Вставить("Имя", "f1");
Файлы.Вставить("ИмяФайла", "file1.txt");
Файлы.Вставить("Данные", Base64Значение("0J/RgNC40LLQtdGCINCc0LjRgCE="));
Файлы.Вставить("Тип", "text/plain");
2019-10-13 03:22:22 +02:00
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post", Неопределено, Новый Структура("Файлы", Файлы));
2019-01-21 04:32:59 +02:00
```
2019-01-30 18:36:00 +02:00
Файл будет закодирован в теле запроса, заголовку `Content-Type` автоматически установлено значение `multipart/form-data` .
2019-01-21 04:32:59 +02:00
2019-01-30 18:36:00 +02:00
## Отправка файлов и данных формы
Для отправки данных формы и файлов в одном запросе нужно сформировать описание файлов и данных формы и передать их в параметрах `ДополнительныеПараметры.Файлы` , `ДополнительныеПараметры.Данные` .
2019-01-21 04:32:59 +02:00
```bsl
2019-01-30 18:36:00 +02:00
Файлы = Новый Массив;
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f1", Base64Значение("ZmlsZTE="), "file1.txt"));
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f2", Base64Значение("ZmlsZTI="), "file2.txt"));
2019-01-21 04:32:59 +02:00
2019-01-30 18:36:00 +02:00
Данные = Новый Структура("field1,field2", "value1", "Значение2");
2019-01-17 00:35:20 +02:00
2019-10-13 03:22:22 +02:00
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post", Неопределено, Новый Структура("Файлы,Данные", Файлы, Данные));
2019-01-30 18:36:00 +02:00
```
2019-01-17 00:35:20 +02:00
2019-01-30 18:36:00 +02:00
Файлы и данные формы будут закодированы в теле запроса, заголовку `Content-Type` автоматически установлено значение `multipart/form-data` .
2019-01-23 02:50:27 +02:00
2019-10-13 03:22:22 +02:00
## Отправка произвольных данных
Чтобы отправить произвольные данные (`Строка`, `ДвоичныеДанные` ) их нужно передать в параметре `Данные` .
```bsl
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,
Новый Структура("Заголовки", Заголовки));
```
2019-01-30 18:36:00 +02:00
## Содержимое ответа
Методы, которые не заканчиваются на Json, созвращают ответ в виде `Структура` :
- `ВремяВыполнения` - Число - время выполнения запроса в миллисекундах
- `Cookies` - cookies полученные с сервера
- `Заголовки` - HTTP заголовки ответа
- `ЭтоПостоянныйРедирект` - признак постоянного редиректа
- `ЭтоРедирект` - признак редиректа
- `Кодировка` - кодировка текста ответа
- `Тело` - тело ответа
- `КодСостояния` - код состояния ответа
- `URL` - итоговый URL, по которому был выполнен запрос
Получить данные из ответа в виде JSON, теста или двоичных данных можно с помощью соответствующих методов, описанных ниже.
### Чтение ответа как JSON
Получить данные из ответа в виде десериализованного JSON можно с помощью метода `КакJson` .
```bsl
2019-05-15 15:19:27 +02:00
Результат = КоннекторHTTP.КакJson(КоннекторHTTP.Get("http://httpbin.org/get"));
2019-01-30 18:36:00 +02:00
```
2019-01-17 00:35:20 +02:00
2019-01-30 18:36:00 +02:00
### Чтение ответа как Текст
Получить данные из ответа в виде текста можно с помощью метода `КакТекст` .
```bsl
Результат = КоннекторHTTP.КакТекст(КоннекторHTTP.Get("http://httpbin.org/encoding/utf8"));
```
При этом можно указать кодировку в соответствующем параметре.
Если параметр не указан, то **Коннектор** возьмет значение кодировки из заголовков (если она там есть).
### Чтение ответа как ДвоичныеДанные
Метод `КакДвоичныеДанные` преобразует ответ в `ДвоичныеДанные` .
```bsl
Результат = КоннекторHTTP.КакДвоичныеДанные(КоннекторHTTP.Get("http://httpbin.org/image/png"));
```
## GZip-декодирование
По умолчанию **Коннектор** просит сервер кодировать ответы в формате `GZip` .
Декодирование выполняется прозрачным образом в методах `GetJson` , `PostJson` , `PutJson` , `DeleteJson` , `КакJson` , `КакТекст` , `КакДвоичныеДанные` .
```bsl
Результат = КоннекторHTTP.GetJson("http://httpbin.org/gzip");
```
2019-01-17 00:35:20 +02:00
2019-01-21 04:32:59 +02:00
## Таймаут
2019-01-30 18:36:00 +02:00
Таймаут можно задать в параметре `ДополнительныеПараметры.Таймаут` .
2019-01-21 04:32:59 +02:00
```bsl
2019-10-13 03:22:22 +02:00
Ответ = КоннекторHTTP.Get("https://httpbin.org/delay/10", Неопределено, Новый Структура("Таймаут", 1));
2019-01-21 04:32:59 +02:00
```
Значение по умолчанию - 30 сек.
## Basic-аутентификация
2019-01-30 18:36:00 +02:00
Параметры Basic-аутентификации можно передать в параметре `ДополнительныеПараметры.Аутентификация`
2019-01-21 04:32:59 +02:00
```bsl
Аутентификация = Новый Структура("Пользователь, Пароль", "user", "pass");
Результат = КоннекторHTTP.GetJson(
2019-10-13 03:22:22 +02:00
"https://httpbin.org/basic-auth/user/pass",
Неопределено,
2019-01-21 04:32:59 +02:00
Новый Структура("Аутентификация", Аутентификация));
```
или в `URL`
```bsl
Результат = КоннекторHTTP.GetJson("https://user:pass@httpbin.org/basic-auth/user/pass");
```
## Digest-аутентификация
2019-01-30 18:36:00 +02:00
Параметры Digest-аутентификации можно передать в параметре `ДополнительныеПараметры.Аутентификация` .
2019-01-22 03:19:31 +02:00
При этом `Тип` нужно установить в значение `Digest` .
```bsl
Аутентификация = Новый Структура("Пользователь, Пароль, Тип", "user", "pass", "Digest");
Результат = КоннекторHTTP.GetJson(
2019-10-13 03:22:22 +02:00
"https://httpbin.org/digest-auth/auth/user/pass",
Неопределено,
2019-01-22 03:19:31 +02:00
Новый Структура("Аутентификация", Аутентификация));
```
2019-01-21 04:32:59 +02:00
2019-10-13 03:22:22 +02:00
## AWS4-HMAC-SHA256-аутентификация
Параметры AWS4-HMAC-SHA256-аутентификации можно передать в параметре `ДополнительныеПараметры.Аутентификация` .
При этом `Тип` нужно установить в значение `AWS4-HMAC-SHA256` и задать свойства: `ИдентификаторКлючаДоступа` , `СекретныйКлюч` , `Сервис` , `Регион` .
```bsl
Аутентификация = Новый Структура;
Аутентификация.Вставить("Тип", "AWS4-HMAC-SHA256");
Аутентификация.Вставить("ИдентификаторКлючаДоступа", "AKIAU00002SQ4MT");
Аутентификация.Вставить("СекретныйКлюч", "МойСекретныйКлюч");
Аутентификация.Вставить("Регион", "ru-central1");
Аутентификация.Вставить("Сервис", "s3");
Файл = Новый ДвоичныеДанные("my_file.txt");
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "text/plain");
Заголовки.Вставить("x-amz-meta-author", "Vladimir Bondarevskiy");
Заголовки.Вставить("Expect", "100-continue");
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Заголовки", Заголовки);
ДополнительныеПараметры.Вставить("Аутентификация", Аутентификация);
ДополнительныеПараметры.Вставить("Таймаут", 300);
Ответ = КоннекторHTTP.Put("https://test.storage.yandexcloud.net/my_file.txt", Файл, ДополнительныеПараметры);
```
2019-01-21 04:32:59 +02:00
## Доступ через прокси-сервер
2019-01-30 18:36:00 +02:00
Настройки прокси можно передать в параметре `ДополнительныеПараметры.Прокси` .
2019-01-21 04:32:59 +02:00
```bsl
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "192.168.1.51", 8192);
2019-10-13 03:22:22 +02:00
КоннекторHTTP.GetJson("http://httpbin.org/headers", Неопределено, Новый Структура("Прокси", Прокси));
2019-01-21 04:32:59 +02:00
```
Если в конфигурации используется `БСП` , то настройки прокси по умолчанию берутся из `БСП` .
2019-01-30 18:36:00 +02:00
## Поддерживаемые HTTP методы
Для `GET` , `OPTIONS` , `HEAD` , `POST` , `PUT` , `PATCH` , `DELETE` есть соответствующие методы.
Для любого из HTTP-методов можно отправить запрос через вызов метода `ВызватьМетод` .
2019-01-15 14:27:31 +02:00
2019-01-28 17:15:44 +02:00
## Редиректы (Перенапраления)
**Коннектор** по умолчанию автоматически разрешает редиректы.
Например, попробуем получить результат поиска в Яндексе (http://ya.ru).
```bsl
Результат = КоннекторHTTP.Get("http://ya.ru/", Новый Структура("q", "удаление кеша метаданных инфостарт"));
```
Что по факту произойдет при выполнении этого запроса:
2019-01-30 18:36:00 +02:00
- **Коннектор** выполнит запрос к 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`
2019-01-28 17:15:44 +02:00
Отключить автоматический редирект можно с помощью параметра `ДополнительныеПараметры.РазрешитьПеренаправление` .
2019-01-23 02:50:27 +02:00
2019-10-13 03:22:22 +02:00
## Проверка серверного сертификата SSL
2019-01-30 18:36:00 +02:00
Нужно ли проверять сертификат сервера и какие корневые сертификаты для этого использовать можно задать через параметр `ДополнительныеПараметры.ПроверятьSSL` .
```bsl
Результат = КоннекторHTTP.Get("https://my_super_secret_server.ru/", Новый Структура("ПроверятьSSL", Ложь));
```
2019-01-17 00:35:20 +02:00
2019-01-30 18:36:00 +02:00
## Клиентские сертификаты
Клиентский сертификат можно задать через параметр `ДополнительныеПараметры.КлиентскийСертификатSSL` .
```bsl
КлиентскийСертификатSSL = Новый СертификатКлиентаФайл("my_cert.p12", "123");
Результат = КоннекторHTTP.Get("https://my_super_secret_server.ru/", Новый Структура("КлиентскийСертификатSSL", КлиентскийСертификатSSL));
```
## Работа с Cookies
**Коннектор** извлекает cookies из заголовков `Set-Cookie` ответа сервера для дальнейшего использования.
Полученные cookies можно посмотреть в свойстве ответа `Cookies` .
Передать произвольные cookies на сервер можно с помощью параметра `ДополнительныеПараметры.Cookies` .
```bsl
Cookies = Новый Массив;
Cookies.Добавить(Новый Структура("Наименование,Значение", "k1", Строка(Новый УникальныйИдентификатор)));
Cookies.Добавить(Новый Структура("Наименование,Значение", "k2", Строка(Новый УникальныйИдентификатор)));
2019-10-13 03:22:22 +02:00
Ответ = КоннекторHTTP.Get("http://httpbin.org/cookies", Неопределено, Новый Структура("Cookies", Cookies));
2019-01-30 18:36:00 +02:00
```
2019-01-15 14:27:31 +02:00
2019-01-31 12:19:23 +02:00
## Работа в рамках сессии
2019-01-30 18:36:00 +02:00
**Коннектор** позволяет работать с сервером в рамках сессии, т.е. сохраняет состояние на клиенте между вызовами.
Например, попробуем получить с сайта releases.1c.ru список обновлений.
```bsl
Сессия = КоннекторHTTP.СоздатьСессию();
Ответ = КоннекторHTTP.ВызватьМетодВСеансе(Сессия, "GET", "https://releases.1c.ru/total");
Данные = Новый Структура;
Данные.Вставить("execution", ИзвлечьExecution(Ответ));
Данные.Вставить("username", Константы.Логин.Получить());
Данные.Вставить("password", Константы.Пароль.Получить());
Данные.Вставить("_eventId", "submit");
Данные.Вставить("geolocation", "");
Данные.Вставить("submit", "Войти");
Данные.Вставить("rememberMe", "on");
Ответ = КоннекторHTTP.ВызватьМетодВСеансе(Сессия, "POST", Ответ.URL, Новый Структура("Данные", Данные));
```
2019-01-23 02:50:27 +02:00
2019-01-30 18:36:00 +02:00
Что при этом произойдет:
- **Коннектор** выполнит `GET` запрос к URL `https://releases.1c.ru/total`
- Сервер попросит выполнить запрос к URL `https://login.1c.ru/login?service=https%3A%2F%2Freleases.1c.ru%2Fpublic%2Fsecurity_check`
- **Коннектор** сохранит полученные cookies и выполнит `GET` запрос к URL `https://releases.1c.ru/total`
- Сервер вернет форму, в которой нужно авторизоваться
2019-08-19 09:10:51 +02:00
- Извлечем данные из формы и отправим их на сервер вместе с нашим логином и паролем
2019-01-30 18:36:00 +02:00
- **Коннектор** выполнит `POST` запрос и отправит данные формы и ранее полученные cookies
- Сервер проверит параметры формы и если все хорошо, то выдаст тикет и попросит выполнить запрос к URL `https://releases.1c.ru/total`
- **Коннектор** выполнит `GET` запрос к URL `https://releases.1c.ru/total` и передаст установленные ранее cookies
2019-03-25 16:18:48 +02:00
- Сервер вернет нужный нам результат в виде `html`
2019-01-30 18:36:00 +02:00
Далее используя `Сессия` можно выполнять запросы к серверу и скачивать обновления.