Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
1C-admin
14.10.2019
Коннектор — библиотека для работы с HTTP запросами. Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.
Коннектор: удобный 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
и AWS4-HMAC-SHA256
аутентификация
- Автоматическое разрешение редиректов
- Установка и чтение Cookies
- Работа в рамках сессии с сохранением состояния (cookies, аутентификация и пр.)
- Переиспользование
HTTPСоединение
в рамках сессии
- Работает в т.ч. и на мобильной платформе
- Доступна версия для 1Script
- И многое другое
Требования
Платформа 8.3.10 и выше.
Мобильная платформа (проверено только на 8.3.15)
1Script >=1.1.1
Использование
1С:Предприятие 8
Скопируйте общий модуль к себе в конфигурацию.
1Script
opm install 1connector
Пример мощи библиотеки
Чем же хороша библиотека? Давай уже покажи пример.
Получим данные 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 есть методы: 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
.
Отправка произвольных данных
Чтобы отправить произвольные данные (Строка
, ДвоичныеДанные
) их нужно передать в параметре Данные
.
XML = "...";
Заголовки = Новый Соответствие;
Заголовки.Вставить("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"));
По умолчанию Коннектор просит сервер кодировать ответы в формате 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",
Неопределено,
Новый Структура("Аутентификация", Аутентификация));
AWS4-HMAC-SHA256-аутентификация
Параметры AWS4-HMAC-SHA256-аутентификации можно передать в параметре ДополнительныеПараметры.Аутентификация
.
При этом Тип
нужно установить в значение AWS4-HMAC-SHA256
и задать свойства: ИдентификаторКлючаДоступа
, СекретныйКлюч
, Сервис
, Регион
.
Аутентификация = Новый Структура;
Аутентификация.Вставить("Тип", "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", Файл, ДополнительныеПараметры);
Доступ через прокси-сервер
Настройки прокси можно передать в параметре ДополнительныеПараметры.Прокси
.
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "192.168.1.51", 8192);
КоннекторHTTP.GetJson("http://httpbin.org/headers", Неопределено, Новый Структура("Прокси", Прокси));
Если в конфигурации используется БСП
, то настройки прокси по умолчанию берутся из БСП
.
Поддерживаемые HTTP методы
Для 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
Нужно ли проверять сертификат сервера и какие корневые сертификаты для этого использовать можно задать через параметр ДополнительныеПараметры.Проверять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
запрос к 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
- Сервер вернет форму, в которой нужно авторизоваться
- Извлечем данные из формы и отправим из на сервер вместе с нашим логином и паролем
- Коннектор выполнит
POST
запрос и отправит данные формы и ранее полученные cookies
- Сервер проверит параметры формы и если все хорошо, то выдаст тикет и попросит выполнить запрос к URL
https://releases.1c.ru/total
- Коннектор выполнит
GET
запрос к URL https://releases.1c.ru/total
и передаст установленные ранее cookies
- Сервер вернут нужный нам результат в виде
html
Далее используя Сессия
можно выполнять запросы к серверу и скачивать обновления.
Как скачать
Исходники доступны на GitHub’e.
Если возникло желание внести материальный вклад в дальнейшее развитие или просто отблагодарить автора, можно скачать библиотеку за SM.
Плюсанул на звездочке. Ну, круто, чувак, круто, поздравляю! 🙂
(1)не автора надо поздравлять, а слобщество. Поздравляю всех 1с ников с появлением request!
Требую включения в состав БСП))
Отлично ,жалко не хватает СМ.Когда рекод работаешь с http забывается…А тут и шпоргалка и удобство.
Алилуя.
(3) БСП поставляется по CC-BY, а тут Apache. Разве можно включить?
Вот ребята пишут что нельзя.
Отличная библиотека, спасибо!
А имеет большой смысл привязываться к 8.3.10? Да, работа с потоками эффективна с т.зр. расходования памяти, но если убрать потоки можно расширить количество конфигураций, на которых библиотеку можно применять.
(7) присоединяюсь к вопросу.
Можно ли будет использовать для более старых конфигураций?
УПП, например очень часто встречается: версия платформы 8.3.10 и выше, но режим совместимости 8.2.13
Годнота пошла в топе. Неужели темные времена на инфостарте закончились )
Очень круто (и почему раньше никто не реализовал?!), даешь порт для OScript!
Однозначный плюс — спасибо
(4) Народ, переведите кто-нибудь? Хотелось бы, так сказать, в общих чертах понять, что интурист говорит.
Молодец. Круто
Спасибо!
Очень вовремя, а то писал какие-то свои реализации частных случаев.
Подскажите, может есть на Python библиотека для «другой стороны»? Я, в основном, на 1С делаю http-сервисы, так же была идея как-то унифицировать обработку входящих запросов, возврат значений и ошибок, webhook’и, подписки.
(14)
Их там много. В самом python более богатые средства работы с HTTP, чем в 1С.
Самый простой Bottle
(7)(8) Ну дело не только в потоках. В принципе портировать на 8.2 можно
Однозначный плюс!
(6)Тогда точно такой же, только больше и другой =))
Упс кнопкой ошибся..
(6) всегда можно договориться )
(20) Я бы с удовольствием всю подсистему получения файлов из интернета заменил на это, за исключением настроек прокси: их всегда брать из настроек БСП и не предлагать переопределять.
Крутой наборчик, спасибо!
Вопрос: а нет ли библиотеки, которая разбирает фильтры OData в какой-нибудь удобный вид?
Надо делать хттп-сервис в 1с, который бы поддерживал базовые фильтры в стиле OData. Наверняка это уже где-то сделано.
Отличная работа! Спасибо!
Сильно! Спасибо!!!
Отличная штука. Ещё бы бьютифул суп сделать для 1с
При переборе куков нужно добавить проверку на то, что есть не только ключ, но значение, а то крашится.
(26) пример запроса можно?
(27)Авито пробовал, например,https://www.avito.ru/rostov-na-donu/lichnye_veschi?s_trg=10
(26) пофиксил
Сам python нужен для работы библиотеки?
(30) Нет
{ОбщийМодуль.КоннекторHTTP.Модуль(1502)}: Ошибка при вызове метода контекста (ПрочитатьJSON)
Объект = ПрочитатьJSON(
по причине:
Непредвиденный символ при чтении JSON
А вот , что выдаёт в ответе PostMan
Показать
А вот код, собирающий ответ
Показать
Что не так ?
(32) Нужно попробовать сделать так:
Скорей всего по какой-то причин ответ пришел не в формате JSON
(33)
Спасибо.
Полдела есть «<title>IIS 10.0 Detailed Error — 401.5 — Unauthorized</title> »
Вот код
Вызов же вроде верный.
(34) В публикации сервиса в IIS используется анонимная аутентификация?
(33)Ещё раз спасибо. Одной запятой перед параметрами не хватило.
Не рассмотрел в примере из шапки 2 запятые в конце.
подскажите, как задать параметр ассоциативный массив? (sort[updated_at]=3)
Пробовал так:
П
(37)
Поправил ошибку.
Должно работать так:
(38)
взлетело, спасибо
(32)
Тож самое.
(33) На том же попался, что при отправке POST ошибка на непредвиденный символ
Только у меня 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 … ДвоичныеДанные
В теле ответа есть двоичные данные. Очевидно там сервер пишет о своей проблеме в виде строки.
Я бы поправил
через попытку.
Если вышло исключение , то вернуть тело как строку (затолкнув ее в структуру для совместимости типов возвращаемых значений этой функции).
Проще говоря: не всегда на /POST приходит ответ в том, в чем отправили))
(41) Текст ошибки можно посмотреть если вызвать КакТекст.
Вообще, безопасный алгоритм такой:
(42)
Именно так.
Я не совсем понятно описал суть:
Результат =КоннекторHTTP.PostJson(«http://demo1.aut…………./call»,Содержимое,Новый Структура(«Аутентификация», ПараметрыЗапроса));
Если Результат.Получить(«success») Тогда
…..
….
Иначе
Для Каждого ЗаписьОтвета Из Результат.Получить(«errors») Цикл
…….
…….
PostJson не всегда возвращает ожидаемый результат.
Бывают ситуации, когда сервер вернет не 200, а кодСостояния =500 (да много их там), то тело будет содержать в себе не Json, а текст (или xml).
Ошибка возникает именно в строке 1502 , как писали в (32)
(42) Я не совсем понятно выразился.
Использую
Не всегда ответ содержит именно Json. И ошибка в модуле коннектора стр. 1503 как писали в (32).
Я в (41) предложил)
(16) когда ждать порт? Или куда приcылать pull request? Или лучше сделать свой форк?
(45) Лучше свой форк, т.к. реализации будут не совместимы из-за функций работы со строками
(47) в чем именно будет несовместимость? Быстрый анализ кода не выявил каких-то сложностей с заменой встроенных функций работы со строками на самописные. Что я проглядел?
(48) СтрНайти и Найти
То что сейчас работает Найти, это не значит, что она будет работать в следующей версии платформы
(46) Даже библиотеку запилил? Просто огонь! Моё увОжение…
(12) «Отличная разработка! Жалко стартмани не хватает, чтобы скачать. Когда редко работаешь с http — забывается. А тут и документация отличная, и сама библиотека удобная»
Форк для режима совместимости 8.3.5:https://github.com/leemuar/Connector
Добрый день!
1. Какой логин и пароль для обработки тестирования?
2. Как правильно вызвать метод POST c телом из JSON?
При вызове метода PostJson
Выдает ошибку: {ОбщийМодуль.КоннекторHTTP.Модуль(1531)}: Ошибка при вызове метода контекста (ПрочитатьJSON): Недопустимое состояние потока записи JSON
Хотелось бы описание ошибок и примеры по основным методам с данными с которыми будет формироваться запрос.
(53)
Обновил файл, теперь тест с доступом к сайту ИТС необязательный. Вообще, там нужен логин, пароль к веб-ИТС.
А пример можно? В параметр Json передается текст?
Передаю структуру.
(55) Можно увидеть полный код вызова?
(55) В ответе пришел не JSON
Безопасный вариант
Да возвращается не JSON, не понял из описания метода. POST отрабатывает корректно.
И еще интересно, что при POST-запросе с JSON, если приходит редирект 301, то автоматически меняет метод на GET. И после этого ожидаемо падает с 405 кодом…
(58)
RFC 2068 запрещает автоматический редирект для POST если получен код 301.
https://rfc2.ru/2068.rfc/53#p10.3.2
В GET преобразуют большинство браузеров. Думаю стоит привести поведение к RFC — возвращать просто 301 в этом случае
Согласен.
Либо как рекомендуют по ссылке выше: Если код состояния 301 был получен в ответ на запрос, отличный от GET или HEAD, агент пользователя НЕ ДОЛЖЕН автоматически переназначать запрос, пока нет подтверждения пользователя, так как иначе условия запроса изменятся.
(7) о каких именно потоках тут речь?
(61) о новых объектах в платформе 8.3.9+ таких как ПотокВПамяти, ФайловыйПоток и т.п. Подробнее сожно почитать тут:https://wonderland.v8.1c.ru/blog/novye-instrumenty-dlya-raboty-s-dvoichnymi-dannymi-obespechivayut-kak-posledovatelnyy-dostup-k-danny/
Добрый день. NTLM аутентификация не поддерживается?
(63) сейчас не поддерживается
(63) Теперь поддерживается
Не совсем понятно, каким образом можно передать
1) в теле запроса сразу массив
2) имена свойств с «-»
Например:
Подскажите, пожалуйста, какого вида должны быть данные, передаваемые в доп. параметры структурой с именем «Данные»?
(66) вангую, что надо вместо структуры использовать Соответствие
(66)
Можно так
Поддержка OAuth — авторизации не планируется?
(69) Ну с OAuth не все так просто.
Для каких сервисов нужно?
(70) Да возникла задача интеграции с API с авторизацией через Bearer Token в http header.
(71) Если токен есть, то достаточно заполнить заголовок
В разделе содержимое это правильно?
//Цитата
Чтение ответа как JSON
Получить данные из ответа в виде десериализованного JSON можно с помощью метода КакJson.
Результат = КоннекторHTTP.КакJson(КоннекторHTTP.Post((«http://httpbin.org/get»)));
//Конец цитаты
(73) Спасибо, поправил
(68) Спасибо! И еще вопрос — можно ли как-нибудь и как получить статус HTTP-запроса (200, например) и другие корневые свойства в результате?
(75) Все методы без суффикса Json возвращают структуру со свойствами ответа
Т.е. вместо
нужно использовать
Вообще, в статье все это есть)
Каким образом отправить чисто json строку через КоннекторHTTP.Post без предварительного преобразования в Соответствие?
Какова должна быть структура-соответствие-масссив отправляемого через КоннекторHTTP.Post
{«F»:[
{«S»:{«code»:1,»price»:5,»name»:»Конфета»}},
{«S»:{«code»:2,»price»:15,»name»:»Печенье», «qty»:0.5}},
{«D»:{ «prc»:5, «all»:1}},
]}
(78)
Показать
Как-то так
(79)Спасибо! Всё получилось!
Добрый день.
Нет ли в планах или загашниках добавить в библиотеку методов работы с нестандартными для 1С Soap сервисами, схемы которых 1С прочитать не в состоянии и приходится все это отсылать POST’ом, формируя тело самостоятельно?
(81) Планы есть, но пока нет времени
А как в POST запрос передать тело в свободном виде? Не JSON.
(83) какой формат этого тела? Что за данные?
(84)
Текст. XML.
(85) Обновил версию. Отправка выполняется таким образом
Показать
(2)
Жесть. Зашёл, думаю — что за сыр-бор. А тут все друг друга поздравляют с тем, что за 500 рублей продаётся штука из 10 строк?))) Это ж как одинэсники с интернетом работать не умеют, чтобы так радоваться))
request, кстати, бесплатный))
(88) кстати и это всё есть на гитхабе
(88)
А вам я это покоя не дает? Если не способны заработать 500 рублей (вообще-то 5 стартмани), то я могу вам подарить
Это вы про свою разработку видимо?
https://infostart.ru/public/1081151/
(89)
А ссылку можно? В статье только за мани, поиск в гугле и гитхабе ничего не дал.
(92) не знаю как вы искали, но у меня гитхаб поиском по «коннектор» выдает нужный репо в первой же строке
(93)
Искал КоннекторHTTP. Спасибо, по коннектору нашёл
(86) Приветствую!
Хотел бы уточнить.
1) Собираешься ли ты реализовать поддержку параметровURL ? пример «/storage/{Storage}/{ID}»
2) Поддержку соединения, не каждый раз его инициализировать а что-то подобное .СоздатьСессию().
(95)
1) Собираешься ли ты реализовать поддержку параметровURL ? пример «/storage/{Storage}/{ID}»
Это зачем? Можно пример
2) Поддержку соединения, не каждый раз его инициализировать а что-то подобное .СоздатьСессию().
Да, в рамках сессии соединение будет сохраняться, но пока еще не сделал
Есть URL такого видаhttps://…..//storage/ {Storage}/{ID}
Storage и ID это параметры.
Если брать HTTP сервис 1С то в шаблоне они указываются в фигурных скобках.
И тогда когда мы получаем запрос на наш HTTP-сервис:
HTTPСервисЗапрос (HTTPServiceRequest)
Свойства:
HTTPМетод (HTTPMethod)
БазовыйURL (BaseURL)
Заголовки (Headers)
ОтносительныйURL (RelativeURL)
ПараметрыURL (URLParameters)
ПараметрыЗапроса (QueryOptions)
Методы:
ПолучитьТелоКакДвоичныеДанные (GetBodyAsBinaryData)
ПолучитьТелоКакПоток (GetBodyAsStream)
ПолучитьТелоКакСтроку (GetBodyAsString)
Описание:
Описывает запрос к HTTP-сервису.
Доступность:
Сервер, толстый клиент.
{Storage} и {ID} уже будут в структуре ПараметрыURL в удобном виде.
Когда мы обращаемся из 1С на HTTP-Сервисы такого рода с помощью твоего коннектора то приходится делать так:
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить(«Аутентификация», Аутентификация);
НТТPОтвет = КоннекторHTTP.Get(СтрШаблон(«%1/%2%3», URL, Storage, ID),, ДополнительныеПараметры);
Что ИМХО показалось костылём.
Сначала я надеялся на такую реализацию.
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить(«Аутентификация», Аутентификация);
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить(«Storage», «main»);
ПараметрыURL.Вставить(«ID», «1488»);
НТТPОтвет = КоннекторHTTP.Get(URL,, ПараметрыURL, ДополнительныеПараметры);
А так коннектор очень удобный. Пользуюсь, жду соединение в сессии.
как тут
данные в КоннекторHTTP.ВызватьМетодВСеансе Json передать?
Ответ = КоннекторHTTP.ВызватьМетодВСеансе(Сессия, «POST», Ответ.URL, Json);
(98)
Вообще, у этого метода достаточно подробная документация
(95)
Теперь в рамках сессии HTTPСоединение переиспользуется