Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
Разработка - Инструментарий разработчика
Коннектор: удобный 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Соединениев рамках сессии - Настраиваемые повторные попытки соединения/отправки запроса с экспоненциальной задержкой
- Работает в т.ч. и на мобильной платформе
- Доступна версия для 1Script
- И многое другое
Требования
Платформа 8.3.10 и выше.
Мобильная платформа (проверено только на 8.3.15)
1Script >=1.1.1
Где взять
1С:Предприятие 8
https://github.com/vbondarevsky/Connector
1Script
https://github.com/vbondarevsky/1connector
Использование
1С:Предприятие 8
Скопируйте общий модуль КоннекторHTTP к себе в конфигурацию.
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
И это достаточно простой пример. Всю мощь библиотеки рассмотрим далее.
Работать с параметрами запроса очень просто:
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("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.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 = "...";
Заголовки = Новый Соответствие;
Заголовки.Вставить("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.
Для этого нужно добавить заголовок Content-Encoding = gzip.
Примечание: сервер должен быть настроен соответствующим образом, чтобы распаковывать входящие запросы.
Json = Новый Структура;
Json.Вставить("field", "value");
Json.Вставить("field2", "value2");
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Encoding", "gzip");
Результат = КоннекторHTTP.PostJson("http://httpbin.org/anything", Json, Новый Структура("Заголовки", Заголовки));
По умолчанию Коннектор просит сервер кодировать ответы в формате GZip. Декодирование выполняется прозрачным образом в методах GetJson, PostJson, PutJson, DeleteJson, КакJson, КакТекст, КакДвоичныеДанные.
Примечание: любое кодирование тела ответа можно отключить, задав заголовок Accept-Encoding = identity.
Результат = Коннектор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");
Аутентификация.Вставить("ИдентификаторКлючаДоступа", "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", Неопределено, Новый Структура("Прокси", Прокси));
Если в конфигурации используется БСП, то настройки прокси по умолчанию берутся из БСП.
Для 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
Далее используя Сессия можно выполнять запросы к серверу и скачивать обновления.
Коннекторможет автоматически выполнять повторные попытки соединения/отправки запроса с задержкой.
Это бывает полезно если:
- Соединение нестабильное
- Сервер перегружен и может "пятисотить"
- Сервер находится на обслуживании (перезагрузка, изменение конфигов, обновление и т.п.)
- Сервер ограничивает количество запросов от клиента
Включить повторы можно с помощью параметра `ДополнительныеПараметры.МаксимальноеКоличествоПовторов`, задав значение больше 0.
Параметр `ДополнительныеПараметры.МаксимальноеВремяПовторов` позволяет ограничить суммарное время (таймауты + задержки между попытками).
Значение по умолчанию: 10 мин.
Длительность задержки между попытками:
- Растет экспоненциально (1 сек, 2 сек, 4 сек, 8 сек, 16 сек, ...). Можно регулировать с помощью параметра
ДополнительныеПараметры.КоэффициентЭкспоненциальнойЗадержки - Для кодов состояний
413,429или503в качестве задержки используется значение заголовкаRetry-After(длительность в секундах или конкретная дата).
Параметр ДополнительныеПараметры.ПовторятьДляКодовСостояний позволяет задать коды состояний, при которых нужно выполнять повтор.
Если параметр не задан, повтор будет выполняться для всех кодов состояний >=500.
Сессия = КоннекторHTTP.СоздатьСессию();
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("МаксимальноеКоличествоПовторов", 5);
ДополнительныеПараметры.Вставить("Заголовки", Заголовки);
URL = "http://127.0.0.1:5000/retry_after_date";
Ответ = КоннекторHTTP.Get(URL, Неопределено, ДополнительныеПараметры);
ТОП-6 инструментов для разработчика 1С
Подборка лучших инструментов для разработчика 1С включает Toolkit, DCT, OneDebugger, PrintWizard, DataFormWizard и Infostart MCP. Любой инструмент со скидкой 20% при покупке от двух решений.
Вступайте в нашу телеграмм-группу Инфостарт
http post get cookie ssl url multipart/form-data x-www-form-urlencoded gzip редирект digest дайджест аутентификация https hmac aws aws-hmac-sha256 amazon basic
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Платные (руб)
Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.
50000 руб.
10.09.2026 13997 125 0
Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Разработчик Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)
Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.
24900 руб.
20.08.2024 83455 432 171
Инструментарий разработчика Роли и права Запросы СКД Разработчик Руководитель проекта 1С:Предприятие 8 Платные (руб)
Инструменты для разработчиков 1С 8.3 и 8.5: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.
16500 руб.
02.09.2020 286087 1608 423
Инструментарий разработчика Разработка Администрирование веб-серверов Системный администратор Разработчик Аналитик Руководитель проекта 1С 8.3 Платные (руб)
Analyzer 1C сводит выгрузку 1С — основную конфигурацию и все расширения — в единый граф знаний. Любой запрос по связям за доли секунды, с пометками «Доб.» / «Заимств.» / «Переопределено». Новое в 2.0 — обновление поставки: сравнение и объединение версий деревом «как в Конфигураторе» с выгрузкой плана решений; поиск конфликтов из-за перехватов расширений и висячих ссылок; загрузка из бинарных .cf/.cfe; циклические зависимости. Плюс анализ влияния, запросы BSL, роли и RLS, граф вызовов. Минута на развёртывание через Docker без необходимости подключения к Интернет. Любая 1С:Предприятие 8.3+.
14000 руб.
17.04.2026 17009 63 62
Пакетная печать Печатные формы Инструментарий разработчика Разработчик 1С:Предприятие 8 Платные (руб)
Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм. Обновление версии от 21.04.26
22570 руб.
06.10.2023 44334 123 54
Инструментарий разработчика Нейросети Платные (руб)
Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.
15250 руб.
25.08.2025 77214 147 41
Разработка Инструментарий разработчика Разработчик Руководитель проекта 1С 8.3 Платные (руб)
Pilot 1C превращает задачу, поставленную обычными словами, в техническое задание, код на встроенном языке и сценарии проверки. Прежде чем что-то предложить, он сверяется с устройством вашей конфигурации через граф Analyzer 1C: существует ли объект, из чего он состоит, кто его вызывает, какие роли дают права. Чего найти не удалось – спрашивает, а не выдумывает. Готовый код проходит более полутора сотен проверок по справочнику языка и стандартам разработки, который приезжает вместе с продуктом. Модель – ваша: любой сервер, совместимый с программным интерфейсом OpenAI, в том числе локальный. Правки в конфигурацию Pilot не вносит – их применяет разработчик.
18300 руб.
11.09.2026 3845 5 0
Инструменты администратора БД Инструментарий разработчика Роли и права Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)
Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.
17000 руб.
10.11.2023 28825 104 46
opm install 1connectorЖесть. Зашёл, думаю - что за сыр-бор. А тут все друг друга поздравляют с тем, что за 500 рублей продаётся штука из 10 строк?))) Это ж как одинэсники с интернетом работать не умеют, чтобы так радоваться))
request, кстати, бесплатный))
А вам я это покоя не дает? Если не способны заработать 500 рублей (вообще-то 5 стартмани), то я могу вам подарить
Это вы про свою разработку видимо?
А имеет большой смысл привязываться к 8.3.10? Да, работа с потоками эффективна с т.зр. расходования памяти, но если убрать потоки можно расширить количество конфигураций, на которых библиотеку можно применять.
Очень вовремя, а то писал какие-то свои реализации частных случаев.
Подскажите, может есть на Python библиотека для "другой стороны"? Я, в основном, на 1С делаю http-сервисы, так же была идея как-то унифицировать обработку входящих запросов, возврат значений и ошибок, webhook'и, подписки.
Вопрос: а нет ли библиотеки, которая разбирает фильтры 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
Пробовал так:
П
араметрыЗапроса = Новый Структура;
СтруктураСортировка = Новый Соответствие;
СтруктураСортировка .Вставить("updated_at ",3);
ПараметрыЗапроса.Вставить("sort", СтруктураСортировка );Поправил ошибку.
Должно работать так:
ПараметрыЗапроса = Новый Соответствие;
ПараметрыЗапроса.Вставить("sort[updated_at]", "3");
Ответ = КоннекторHTTP.Get("http://direct.ru/lead/25/list", ПараметрыЗапроса);opm install 1connector1. Какой логин и пароль для обработки тестирования?
2. Как правильно вызвать метод POST c телом из JSON?
При вызове метода PostJson
Выдает ошибку: {ОбщийМодуль.КоннекторHTTP.Модуль(1531)}: Ошибка при вызове метода контекста (ПрочитатьJSON): Недопустимое состояние потока записи JSON
Хотелось бы описание ошибок и примеры по основным методам с данными с которыми будет формироваться запрос.
Обновил файл, теперь тест с доступом к сайту ИТС необязательный. Вообще, там нужен логин, пароль к веб-ИТС.
А пример можно? В параметр Json передается текст?
Безопасный вариант
Ответ = КоннекторHTTP.Post(....);
Если Ответ.КодСостояния = 200 Тогда // Зависит от сервиса, где-то и на ошибки возвращать будут JSON
Результат = КоннекторHTTP.КакJson(Ответ);
Иначе
ВызватьИсключение(КоннекторHTTP.КакТекст(Ответ));
КонецЕсли;И еще интересно, что при POST-запросе с JSON, если приходит редирект 301, то автоматически меняет метод на GET. И после этого ожидаемо падает с 405 кодом...
RFC 2068 запрещает автоматический редирект для POST если получен код 301.
В GET преобразуют большинство браузеров. Думаю стоит привести поведение к RFC - возвращать просто 301 в этом случае
Либо как рекомендуют по ссылке выше: Если код состояния 301 был получен в ответ на запрос, отличный от GET или HEAD, агент пользователя НЕ ДОЛЖЕН автоматически переназначать запрос, пока нет подтверждения пользователя, так как иначе условия запроса изменятся.
// Создает объект для хранения параметров сессии.
//
// Возвращаемое значение:
// Структура - параметры сессии:
// *Заголовки - Соответствие - HTTP заголовки запроса.
// *Аутентификация - Структура - параметры аутентификации запроса.
// *ИспользоватьАутентификациюОС - Булево - включает использование аутентификации NTLM или Negotiate.
// Значение по умолчанию: Ложь.
// *Тип - Строка - тип аутентификации. Для Basic Тип можно не указывать.
Функция СоздатьСессию() Экспорт
1) в теле запроса сразу массив
2) имена свойств с "-"
Например:
[
{
"ship-id": "1", ...}
{
"ship-id": "1", ...}
]Подскажите, пожалуйста, какого вида должны быть данные, передаваемые в доп. параметры структурой с именем "Данные"?
Можно так
Json = Новый Массив;
ВложенныйОбъект = Новый Соответствие;
ВложенныйОбъект.Вставить("ship-id", "1");
Json.Добавить(ВложенныйОбъект);
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post", Json);
Т.е. вместо
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post", Json);
нужно использовать
Ответ = КоннекторHTTP.Post("https://httpbin.org/post", Json);
Ответ.КодСостояния - то что нужно
Результат = КоннекторHTTP.КакJson(Ответ);
Вообще, в статье все это есть)
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer МойСуперСекретныйТокен");
Результат = КоннекторHTTP.GetJson("http://httpbin.org/headers",, Новый Структура("Заголовки", Заголовки));//Цитата
Чтение ответа как JSON
Получить данные из ответа в виде десериализованного JSON можно с помощью метода КакJson.
Результат = КоннекторHTTP.КакJson(КоннекторHTTP.Post(("http://httpbin.org/get")));
//Конец цитаты
F = Новый Структура;
Объекты = Новый Массив;
Объекты.Добавить(Новый Структура("S", Новый Структура("code,price,name", 1, 5, "Конфета")));
Объекты.Добавить(Новый Структура("S", Новый Структура("code,price,name,qty", 2, 15, "Печенье", 0.5)));
Объекты.Добавить(Новый Структура("D", Новый Структура("prc,all", 5, 1)));
F.Вставить("F", Объекты);
Ответ = КоннекторHTTP.PostJson("http://httpbin.org/post", F);
ПоказатьКак-то так
Нет ли в планах или загашниках добавить в библиотеку методов работы с нестандартными для 1С Soap сервисами, схемы которых 1С прочитать не в состоянии и приходится все это отсылать POST'ом, формируя тело самостоятельно?
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,
Новый Структура("Заголовки", Заголовки));
ПоказатьХотел бы уточнить.
1) Собираешься ли ты реализовать поддержку параметровURL ? пример "/storage/{Storage}/{ID}"
2) Поддержку соединения, не каждый раз его инициализировать а что-то подобное .СоздатьСессию().
1) Собираешься ли ты реализовать поддержку параметровURL ? пример "/storage/{Storage}/{ID}"
Это зачем? Можно пример
2) Поддержку соединения, не каждый раз его инициализировать а что-то подобное .СоздатьСессию().
Да, в рамках сессии соединение будет сохраняться, но пока еще не сделал
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, ДополнительныеПараметры);
А так коннектор очень удобный. Пользуюсь, жду соединение в сессии.
Нужно отправить пост запрос с параметром и телом запроса.
какая конструкция должна быть с использованием этого коннектора?
ответ = post(Запрос,Параемтры,ДополнительныеПараметры);Куда ложить тело а куда параметры?
нет.
Мой запрос:
где omsId=531af4d8-409c-49cb - это параметр запроса.
В запросе я передаю json строку.
Как мне используя ваш коннектор выполнить этот запрос?
Json = Новый Структура("key", "value");
Параметры = Новый Соответствие;
Параметры.Вставить("omsId", "531af4d8-409c-49cb");
ДополнительныеПараметры = Новый Структура("ПараметрыЗапроса", Параметры);
Ответ = КоннекторHTTP.PostJson(
"https://suz2.crpt.ru/api/v2/light/orders", Json, ДополнительныеПараметры);
ДополнительныеПараметры = Новый Структура("ПараметрыЗапроса, Json", Параметры, Json);
Ответ = КоннекторHTTP.Post(
"https://suz2.crpt.ru/api/v2/light/orders", Неопределено, ДополнительныеПараметры);
Показатьок. А куда вставлять заголовки?
Пример тот же, но нужно вставить заголовок:
clientToken: "token"
Куда его поместить?
ИначеЕсли НЕ ЗначениеЗаполнено(Json) Тогда
на
ИначеЕсли Json <> Неопределено Тогда.
Это позволит отправлять запросы с пустым содержимым Json, по типу этого:
POST /v2/posting/fbs/act/create HTTP/1.1
Host: api-seller.ozon.ru/apiref/ru/
Content-Type: application/json
{}
Файлы = Новый Массив;
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f1", Base64Значение("ZmlsZTE="), "file1.txt"));
Файлы.Добавить(Новый Структура("Имя,Данные,ИмяФайла", "f2", Base64Значение("ZmlsZTI="), "file2.txt"));
Данные = Новый Структура("field1,field2", "value1", "Значение2");
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post", Неопределено, Новый Структура("Файлы,Данные", Файлы, Данные));
ПоказатьЗачем так всё "усложнять" с передачей данных формы - сразу двумя путями:
- через 2-ой параметр
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post", Данные, Новый Структура("Файлы", Файлы));- через 3-тий параметр "ДополнительныеПараметры" (как в примере выше).
Так реализовано было в оригинальном Python.Requests (простите не знаком с этой библиотекой)?
На мой взгялд, этот второй параметр ("Данные") тут лишний - в большинстве случаев (кроме тривиальных) всегда,так-или, иначе будет потребность задействовать 3-тий параметр "ДополнительныеПараметры" - а значит 2-той почти всегда будет пропущзен = неопределено - даже если надо передать данные формы - их удобнее передать через "ДополнительныеПараметры".
Я понимаю, что в Python.Requests наверняка для этих целей используют именованные реквизиты, а не структуру "ДополнительныеПараметры", но считаю зря - параметр данных формы Вы оставили отдельным аргументом.
И ещё о сессиях (наверное тоже взято из Python.Requests?)
Сессия = КоннекторHTTP.СоздатьСессию();
Ответ = КоннекторHTTP.ВызватьМетодВСеансе(Сессия, "GET", "https://releases.1c.ru/total");
На мой взгляд, сессии нужно было унифицировать с обычными методами http-команд, передавая сессию либо отдельным аргментом (влед за "ДополнительнымиПараметрами", либо, что, наверное, лучше - передавать в самом аргументе "ДополнительнымиПараметрами".
Сессия = КоннекторHTTP.СоздатьСессию();
Ответ = КоннекторHTTP.Get("https://releases.1c.ru/total",,Новый Структура("Сессия", Сессия));
И не плодить отдельные и более общие методы для работы в сессиях
Ответ = КоннекторHTTP.ВызватьМетодВСеансе(Сессия, "POST", Ответ.URL, Новый Структура("Данные", Данные));А и ещё, в одно случае у вас это "Сессия": "КоннекторHTTP.СоздатьСессию()"
А в другом - "Сеанс": "КоннекторHTTP.ВызватьМетодВСеансе"
Диссонанс именования одной и той же сущности
P.S.
Ну и хотелось бы иметь примеры работы с OData - и, в частности, расширение библиотеки для работы с REST-API 1С Предприятие 8 (как с ИБ, так и для администрирования сервера приложений - хотя последнее уже не так актуально, появлением в 1С объекта "АдминистрированиеСервера"; но REST-API очень даже актуален). да и вообще - хорошо было бы показать "низкоуровневые" примеры работы в WEB-сервисами
Но это уже хателки
Крашит Предприятие, версия 8.3.10.2252
Процедура Кнопка6Нажатие(Элемент)
Заголовки = Новый Соответствие;
Заголовки = Новый Соответствие();
Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
Заголовки.Вставить("Referer", "https://b2b.tui.ua/default.php?page=cl_refer&CLAIM=4203868");
Заголовки.Вставить("Connection", "keep-alive");
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Заголовки.Вставить("Upgrade-Insecure-Requests", "1");
Заголовки.Вставить("Content-Charset", "utf-8");
Заголовки.Вставить("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
Заголовки.Вставить("Accept-Encoding", "gzip, deflate, br");
Заголовки.Вставить("Accept-Charset", "utf-8");
Заголовки.Вставить("Cookie", Куки);
Параметры = Новый Соответствие;
ДополнительныеПараметры = Новый Структура("ПараметрыЗапроса", Параметры);
Аутентификация = Новый Структура("login, Password","Мой логин","Мой пароль");
ДополнительныеПараметры.Вставить("Заголовки", Заголовки);
ДополнительныеПараметры.Вставить("Аутентификация", Аутентификация);
Результат = КоннекторHTTP.КакТекст(КоннекторHTTP.Post("https://b2b.tui.ua/default.php?page=cl_refer&CLAIM=4203868", Неопределено, ДополнительныеПараметры));
//ОтветСервера = Результат.ПолучитьТелоКакСтроку();
Данные = Новый Структура;
Данные.Вставить("samo_action", "logon");
Данные.Вставить("logon_key", ИдентификаторСессии);
Данные.Вставить("login", "Мой логин");
Данные.Вставить("passwd", "Мой Пароль");
Таймаут = Новый Структура("Таймаут", 5);
ДополнительныеПараметры.Вставить("Таймаут", Таймаут);
Ответ = КоннекторHTTP.Post("https://b2b.tui.ua/default.php?page=cl_refer&CLAIM=4203868", Данные);
Ответ = КоннекторHTTP.Post("https://b2b.tui.ua/default.php?page=cl_refer&CLAIM=4203868", Данные,ДополнительныеПараметры); ПоказатьВнесу свои 5 копеек.
При передачи параметра, содержащего закодированный урл с несколькими "вложенными параметрами" происходит некорректное декодирование.
Например урл:
Будет расценен как:
Предлагаемое решение:
//Запрос = РаскодироватьСтроку(Запрос, СпособКодированияСтроки.URLВКодировкеURL);
//Для Каждого СтрокаКлючРавноПараметр Из СтрРазделить(Запрос, "&", Ложь) Цикл
Для Каждого СтрокаКлючРавноПараметрЗакодированный Из СтрРазделить(Запрос, "&", Ложь) Цикл
СтрокаКлючРавноПараметр = РаскодироватьСтроку(СтрокаКлючРавноПараметрЗакодированный , СпособКодированияСтроки.URLВКодировкеURL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer "+ Токен);
Результат = ConnectorHTTP.Get("xxxxxxxxx:344/api/GetNewMessageID",, Новый Структура("Заголовки", Заголовки));
Код ответа 404, хотя в Postman все адекватно.
PS Разобрался, нужен был Post
Если Не ЗаголовокHostЕстьВЗапросе Тогда
ЗаголовокHostЕстьВЗапросе = Заголовок = "host";
КонецЕсли;Автор, большое спасибо за труды!
Можно даже не за обычное спасибо.
Есть адрес
В браузере заходишь, появляется окошко офис365, прохожу авторизацию и получаю фотку.
А вот с коннектором чего-то не хотит - как редирект оно окно 365 не "хавает" и сразу возвращает 401.
<404> не равно <200>:
{Обработка.Тесты.МодульОбъекта(895)}: ВызватьИсключение(СтрШаблон("<%1> не равно <%2>: %3", ЛевоеЗначение, ПравоеЗначение, Пояснение));
{Обработка.Тесты.МодульОбъекта(519)}: УтверждениеВерно(Ответ.КодСостояния, 200);
{Обработка.Тесты.МодульОбъекта(45)}: Тест_PostИРедирект();
{Обработка.Тесты.Форма.Форма.Форма(18)}: РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере();
{Обработка.Тесты.Форма.Форма.Форма(6)}: ВыполнитьТестыНаСервере();В моей реализации
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Исключение
СообщитьОбОшибке(ИмяОбмена, ОписаниеОшибки());
Отказ = Истина;
HTTPОтвет = Новый Структура;
HTTPОтвет.Вставить("КодСостояния", 500);
КонецПопытки;
ПоказатьСейчас придется оборачивать в попытку ВызватьМетодВСеансе().
Задача: сгенерировать ссылку с параметрами и открыть ее на клиенте
Что то вроде:
но модуль коннектора серверный и без вызова сервера
напрашивается часть модуля перенести в КлиентСервер
еще есть сценарии когда нужно делать HTTP запрос с клиента
(161)
(162) Что касается работы на клиенте. В тонком клиенте часть объектов не работает, в веб-клиенте не работает основная часть.
Мысли сделать версию, разбив на подмодули, у меня есть, но по срокам пока ничего не скажу
Подскажите плиз как используя данную библиотеку возможно работать через webdav яндекс-диска, (скачивать, закачивать, создавать урл для публичного доступа...)
В частности интересует как получить через webdav список файлов в папке яндекс диска.
НастройкиСериализацииJSON.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением;Чтобы JSON Записал дату Со Смещением, а прочитал так как это работает
ПреобразованиеДат = СтрРазделить(ИменаСвойствСоЗначениямиДата, ",");
ДополнительныеПараметры = Новый Структура;
ПараметрыПреобразования = Новый Структура;
ПараметрыПреобразования.Вставить("ФорматДатыJSON", ФорматДатыJSON.ISO);
ПараметрыПреобразования.Вставить("ИменаСвойствСоЗначениямиДата", ПреобразованиеДат);
ДополнительныеПараметры.Вставить("ПараметрыПреобразованияJSON", ПараметрыПреобразования); ПоказатьПомогите разобраться.
Отправляю в PostMan запрос и получаю ответ. Всё ок(см.прикреп.изображение).
А через Коннектор:
Результат = КоннекторHTTP.PostJson("mobile.api.crpt.ru/mobile/check", Новый Структура("code", "046064860301570000000093236"));
вываливается с ошибкой: Ошибка работы с Интернет: Server returned nothing (no headers, no data)
Там сначала приходит ответ 307. Идёт повторный запрос но уже на https и в этом запросе уже вставляется аутентификация и соотв. тут же валится :(
Потому что код 307 используется, чтобы сделать редирект с http на https. Если указывать схему сразу правильно, то этого лишнего редиректа не будет
Нужно отправить пост запрос с простой строкой в теле ("X,1,______,_,__;;;;;;;");
какая конструкция должна быть с использованием этого коннектора?
Заранее блогодарен.
Автору большое уважение и признание. Проект действительно упрощает и ускоряет разработку.
Очень надеюсь на развитие проекта!
интересно что на такое ответила "техподдержка"
Добрый день, Роман.
Файлы за стартмани не являются готовым решением. Это примеры, шаблоны, алгоритмы, "стройматериалы" для вашей учетной системы (для других программистов). Нет гарантии работоспособности. Вы скачиваете и используете на свой страх и риск. Готовые коммерческие решения с техподдержкой только за рубли.
Есть задача передать файл POST-запросом в теле запроса в параметре "data", куда помещаю файл в виде base64-строки. Использование вашего метода через структуру Файлы.Вставить("Данные", Base64Значение()) не могу использовать, потому что в структуре нет свойства "data". Пробовал обходными путями с помощью ДополнительныеПараметры.Данные, но не получается.
Возможно вашим инструментом это сделать?
Вот пример фрагмента тела запроса, который я пытаюсь сделать:
{
"data": "data:image/gif;base64,R0lGODlhEgASAIIAAHqIltvp9/L4/+nz/+by/5imtN7s+gAAACH5BAAAAAAA
}
Json = Новый Структура("data", "data:image/gif;base64," + Base64Строка(Картинка));
Ответ = КоннекторHTTP.Post(url, Неопределено, Новый Структура("Json", Json));
// Или просто
Результат = КоннекторHTTP.PostJson(url, Json);
Есть вот такой json для вэб-хука discord
{
"username": "Webhook",
"avatar_url": "https://i.imgur.com/4M34hi2.png",
"content": "Text message. Up to 2000 characters.",
"embeds": [
{
"author": {
"name": "Birdie♫",
"url": "https://www.reddit.com/r/cats/",
"icon_url": "https://i.imgur.com/R66g1Pe.jpg"
},
"title": "Title",
"url": "https://google.com/",
"description": "Text message. You can use Markdown here. *Italic* **bold** __underline__ ~~strikeout~~ [hyperlink]( `code`",
"color": 15258703,
"fields": [
{
"name": "Text",
"value": "More text",
"inline": true
},
{
"name": "Even more text",
"value": "Yup",
"inline": true
},
{
"name": "Use `\"inline\": true` parameter, if you want to display fields in the same line.",
"value": "okay..."
},
{
"name": "Thanks!",
"value": "You're welcome :wink:"
}
],
"image": {
"url": "https://i6.imageban.ru/out/2021/04/20/298f63631d98fd9718c3a67e4be2b5ab.jpg"
},
"footer": {
"text": "Woah! So cool! :smirk:",
"icon_url": "https://i.imgur.com/fKL31aD.jpg"
}
}
]
}
В методе КоннекторHTTP.PostJson() можно передать структурой, которая потом преобразуется в json. Но, чтобы описать такую структуру надо не хило так заморочиться...
Пробовал передавать готовый json прям текстом, но в результате текст json изменяется: добавляются /n,/...
"{\n\"username\": \"Webhook\",\n\"avatar_url\": \"https://i.imgur.com/4M34hi2.png\",\n\"content\": \"Text me
Пробовал победить это с помощью
ДополнительныеПарамеры = новый Структура;
ПараметрыЗаписиJSON = Новый Структура;
ПараметрыЗаписиJSON.Вставить("ПереносСтрок", ПереносСтрокJSON.Авто);
ПараметрыЗаписиJSON.Вставить("СимволыОтступа", " ");
ПараметрыЗаписиJSON.Вставить("ИспользоватьДвойныеКавычки", Истина);
ПараметрыЗаписиJSON.Вставить("ЭкранированиеСимволов", ЭкранированиеСимволовJSON.Нет);
ПараметрыЗаписиJSON.Вставить("ЭкранироватьУгловыеСкобки", Ложь);
ПараметрыЗаписиJSON.Вставить("ЭкранироватьРазделителиСтрок", Ложь);
ПараметрыЗаписиJSON.Вставить("ЭкранироватьАмперсанд", Ложь);
ПараметрыЗаписиJSON.Вставить("ЭкранироватьОдинарныеКавычки", Ложь);
ПараметрыЗаписиJSON.Вставить("ЭкранироватьСлеш", Ложь);
ДополнительныеПарамеры.Вставить("ПараметрыЗаписиJSON", ПараметрыЗаписиJSON);
Результат = КоннекторHTTP.PostJson("http://httpbin.org/post", JSON, ДополнительныеПарамеры);
ПоказатьНе получается...
Было бы круто сделать некоторый ключ, при наличии которого переданный JSON вообще бы никак не обрабатывался
Файлы одинаковые. Сумма оплаты выбирается по желанию
Файл cf, из которого можно скопировать общий модуль как общий модуль к себе в конфигурацию/расширение или скопировать текст и вставить например в обработку
Вопрос касательно лицензии - можно включать данную библиотеку в свои разработки?
Добавляем функции в конец модуля. Там где используется поиск с конца заменяем на функцию СтрНайтиСКонца и написана функция СтрЗаканчиваетсяНа там соответственно ничего менять не надо. Еще есть место где в функции СтрНайти указано СНачала просто трем.
Функция РазвернутьСтроку(СтрокаИсходная)
ДлиннаСтроки = СтрДлина(СтрокаИсходная);
РазвернутаяСтрока = "";
Для инд = 0 по ДлиннаСтроки -1 Цикл
РазвернутаяСтрока = РазвернутаяСтрока + Сред(СтрокаИсходная, ДлиннаСтроки - инд, 1);
КонецЦикла;
Возврат РазвернутаяСтрока;
КонецФункции
Функция СтрНайтиСКонца(СтрокаИсходная, СтрокаПоиска) Экспорт
ДлиннаСтроки = СтрДлина(СтрокаИсходная);
ДлиннаСтрокиПоиска = СтрДлина(СтрокаПоиска);
РазвернутаяСтрока = РазвернутьСтроку(СтрокаИсходная);
РазвернутаяСтрокаПоиска = РазвернутьСтроку(СтрокаПоиска);
НомерСимвола = СтрНайти(РазвернутаяСтрока, РазвернутаяСтрокаПоиска);
Если НомерСимвола <> 0 Тогда
НомерСимвола = ДлиннаСтроки - (НомерСимвола + ДлиннаСтрокиПоиска) + 2 ;
КонецЕсли;
Возврат НомерСимвола;
КонецФункции
Функция СтрЗаканчиваетсяНа(СтрокаИсходная, СтрокаПоиска)
ДлиннаСтроки = СтрДлина(СтрокаИсходная);
ДлиннаСтрокиПоиска = СтрДлина(СтрокаПоиска);
Концовка = Прав(СтрокаИсходная, ДлиннаСтрокиПоиска );
Возврат Концовка = СтрокаПоиска;
КонецФункции
ПоказатьПодскажите как для POST запроса правильно оформить сложные параметры?
для простых все понятно -
Данные = Новый Структура;
Данные.Вставить("name", СокрЛП(ДанныеНоменклатуры.Номенклатура.НаименованиеПолное));
Данные.Вставить("type_id", ИдТипаТовара);
а если параметры это массив? Т.е. вот такая строка должна получиться:
"&features[КодХарактеристики]=аа173"объясните почему так? вкладку настройки не заполняю, просто запускаю тест, всё ок, кроме шести операций:
FAIL Тест_PostИРедирект
<404> не равно <200>:
{Обработка.Тесты.МодульОбъекта(1059)}: ВызватьИсключение(СтрШаблон("<%1> не равно <%2>: %3", ЛевоеЗначение, ПравоеЗначение, Пояснение));
{Обработка.Тесты.МодульОбъекта(543)}: УтверждениеВерно(Ответ.КодСостояния, 200);
{(1)}:Тест_PostИРедирект()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
FAIL Тест_GetУспешныйРедиректОтносительныйАдрес
Недопустимое состояние потока записи JSON
{ОбщийМодуль.КоннекторHTTP.Модуль(635)}: Объект = ПрочитатьJSON(
{ОбщийМодуль.КоннекторHTTP.Модуль(411)}: Возврат JsonВОбъект(РаспаковатьОтвет(Ответ), Ответ.Кодировка, ПараметрыПреобразованияJSON);
{Обработка.Тесты.МодульОбъекта(569)}: Результат = КоннекторHTTP.КакJson(Ответ);
{(1)}:Тест_GetУспешныйРедиректОтносительныйАдрес()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
Тест_GetУспешныйРедиректАбсолютныйАдрес
по причине:
Недопустимое состояние потока записи JSON
Недопустимое состояние потока записи JSON
{ОбщийМодуль.КоннекторHTTP.Модуль(635)}: Объект = ПрочитатьJSON(
{ОбщийМодуль.КоннекторHTTP.Модуль(411)}: Возврат JsonВОбъект(РаспаковатьОтвет(Ответ), Ответ.Кодировка, ПараметрыПреобразованияJSON);
{Обработка.Тесты.МодульОбъекта(579)}: Результат = КоннекторHTTP.КакJson(Ответ);
{(1)}:Тест_GetУспешныйРедиректАбсолютныйАдрес()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
FAIL Тест_GetЗацикленныйРедирект
по причине:
Недопустимое состояние потока записи JSON
Недопустимое состояние потока записи JSON
{ОбщийМодуль.КоннекторHTTP.Модуль(635)}: Объект = ПрочитатьJSON(
{ОбщийМодуль.КоннекторHTTP.Модуль(411)}: Возврат JsonВОбъект(РаспаковатьОтвет(Ответ), Ответ.Кодировка, ПараметрыПреобразованияJSON);
{Обработка.Тесты.МодульОбъекта(589)}: КоннекторHTTP.КакJson(КоннекторHTTP.Get("http://httpbin.org/redirect/31"));
{(1)}:Тест_GetЗацикленныйРедирект()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
FAIL Тест_GetОтключенныйРедирект
по причине:
Недопустимое состояние потока записи JSON
{Обработка.Тесты.МодульОбъекта(1081)}: ВызватьИсключение(ТекстИсключения);
{Обработка.Тесты.МодульОбъекта(591)}: ВерноеИсключение(ИнформацияОбОшибке(), "СлишкомМногоПеренаправлений");
{(1)}:Тест_GetЗацикленныйРедирект()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
<404> не равно <307>:
{Обработка.Тесты.МодульОбъекта(1059)}: ВызватьИсключение(СтрШаблон("<%1> не равно <%2>: %3", ЛевоеЗначение, ПравоеЗначение, Пояснение));
{Обработка.Тесты.МодульОбъекта(604)}: УтверждениеВерно(Ответ.КодСостояния, 307);
{(1)}:Тест_GetОтключенныйРедирект()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
Недопустимое состояние потока записи JSON
{ОбщийМодуль.КоннекторHTTP.Модуль(635)}: Объект = ПрочитатьJSON(
{ОбщийМодуль.КоннекторHTTP.Модуль(411)}: Возврат JsonВОбъект(РаспаковатьОтвет(Ответ), Ответ.Кодировка, ПараметрыПреобразованияJSON);
{Обработка.Тесты.МодульОбъекта(615)}: КоннекторHTTP.КакJson(Ответ);
{(1)}:Тест_РедиректСУказаниемURL()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
FAIL Тест_РедиректСУказаниемURL
по причине:
Недопустимое состояние потока записи JSON
так же обнаружил
FAIL Тест_ПовторСУчетомЗаголовкаRetryAfterDate
по причине:
Ошибка работы с Интернет: Не могу установить соединение
{ОбщийМодуль.КоннекторHTTP.Модуль(1577)}: ВызватьИсключение(ПодробноеПредставлениеОшибки(ОшибкаВыполненияЗапроса));
{ОбщийМодуль.КоннекторHTTP.Модуль(907)}: Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
{ОбщийМодуль.КоннекторHTTP.Модуль(46)}: Возврат ВызватьHTTPМетод(ТекущаяСессия, "GET", URL, ДополнительныеПараметры);
{Обработка.Тесты.МодульОбъекта(971)}: Ответ = КоннекторHTTP.Get(URL, Неопределено, ДополнительныеПараметры);
{(1)}:Тест_ПовторСУчетомЗаголовкаRetryAfterDate()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
FAIL Тест_ПовторСУчетомЗаголовкаRetryAfterDuration
по причине:
Ошибка работы с Интернет: Не могу установить соединение
{ОбщийМодуль.КоннекторHTTP.Модуль(1577)}: ВызватьИсключение(ПодробноеПредставлениеОшибки(ОшибкаВыполненияЗапроса));
{ОбщийМодуль.КоннекторHTTP.Модуль(907)}: Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
{ОбщийМодуль.КоннекторHTTP.Модуль(46)}: Возврат ВызватьHTTPМетод(ТекущаяСессия, "GET", URL, ДополнительныеПараметры);
{Обработка.Тесты.МодульОбъекта(951)}: Ответ = КоннекторHTTP.Get(URL, Неопределено, ДополнительныеПараметры);
{(1)}:Тест_ПовторСУчетомЗаголовкаRetryAfterDuration()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
FAIL Тест_ПовторПослеОшибки502
по причине:
Ошибка работы с Интернет: Не могу установить соединение
{ОбщийМодуль.КоннекторHTTP.Модуль(1577)}: ВызватьИсключение(ПодробноеПредставлениеОшибки(ОшибкаВыполненияЗапроса));
{ОбщийМодуль.КоннекторHTTP.Модуль(907)}: Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
{ОбщийМодуль.КоннекторHTTP.Модуль(46)}: Возврат ВызватьHTTPМетод(ТекущаяСессия, "GET", URL, ДополнительныеПараметры);
{Обработка.Тесты.МодульОбъекта(991)}: Ответ = КоннекторHTTP.Get(URL, Неопределено, ДополнительныеПараметры);
{(1)}:Тест_ПовторПослеОшибки502()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
OK Тест_ПовторПослеОшибкиПодключения
FAIL Тест_Ping
по причине:
Ошибка работы с Интернет: Не могу установить соединение
{ОбщийМодуль.КоннекторHTTP.Модуль(1577)}: ВызватьИсключение(ПодробноеПредставлениеОшибки(ОшибкаВыполненияЗапроса));
{ОбщийМодуль.КоннекторHTTP.Модуль(907)}: Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
{ОбщийМодуль.КоннекторHTTP.Модуль(46)}: Возврат ВызватьHTTPМетод(ТекущаяСессия, "GET", URL, ДополнительныеПараметры);
{Обработка.Тесты.МодульОбъекта(1025)}: Ответ = КоннекторHTTP.Get(URL);
{(1)}:Тест_Ping()
{Обработка.Тесты.МодульОбъекта(104)}: Выполнить(СтрокаТаблицы.Тест + "()");
{Обработка.Тесты.Форма.Форма.Форма(119)}: РезультатаВыполнения = РеквизитФормыВЗначение("Объект").ВыполнитьТестыНаСервере(РеквизитФормыВЗначение("Тесты"));
Данные=Новый Соответствие;
Данные.Вставить("tovar",Товар.Номенклатура.НаименованиеПолное);
Данные.Вставить("edizm",Строка(ЕдиницыИзмерения.Найти(Товар.ЕдИзм.Наименование).Значение));
Данные.Вставить("price",Формат(Цена,"ЧДЦ=2; ЧРД=.; ЧГ=0"));
Данные.Вставить("okpd_code",Товар.КодОКПД);
Данные.Вставить("published","true");
Данные.Вставить("magaz_num",Товар.Номенклатура.Код);
Ответ = КоннекторHTTP.КакJson(КоннекторHTTP.Post(АдресHTML+АдресРесурса, Данные));
ПоказатьСервер отвечает, что неверно переданы параметры. Что я не так делаю?
Возможно если передавать в качестве данных Соответсвие то нужно указать в доп параметрах ПараметрыСериализации.
Попробуйте передать в тело строку или использовать PostJson
Не всегда чей то API может возвращать чтото в теле ответа, При этом все в JSON. К примеру Обертка MongoDB на RestHeart при отправке POST запроса вернет только код 201 ОК. При этом коннектор упадет в исключение при попытке сериализации пустого тела в JSON
Пару вещей которые пришлось правда доделать )) Возможно пригодятся другим:
1. Результат = БОНД_Коннектор.Post("УРЛ", Неопределено, ДополнительныеПараметры);
Результат.Тело возвращается в двоичных данных. Что бы получить сообщение в случае ошибки, нужно преобразовывать:
ПолучитьСтрокуИзДвоичныхДанных(Результат.Тело);
2. Сервис принимает запросы в формате мультипарт. Часть данных это текст, часть данных файл. Причем параметр файла не обязателен.
Сейчас при автоматическом формировании заголовков считает что если файлов нет, то это не мультипарт (
В результате сервис не принимает такой запрос.
Пришлось добавить параметр в структуру "ДополнительныеПараметры" и приводить принудительно к мультипарт даже если файлов нет.
3. Метод БОНД_Коннектор.GetJson не до конца преобразовывает в структуру. Пример:
Приходит Структура, один из параметров которой Массив. В массиве элементы тоже Структурой.
Один из параметров Структуры - строка Json, которой она и осталась в результате преобразования. Делал дополнительное преобразование:
Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
ЗаписьДанных.ЗаписатьСтроку(Данные["cart"]);
ЗаписьДанных.Закрыть();
Структура = БОНД_Коннектор.JsonВОбъект(Поток.ЗакрытьИПолучитьДвоичныеДанные());ПараметрыЗапроса = Новый Соответствие;
Фильтры = Новый Соответствие;
Фильтры.Вставить("since", ПериодОтчета.ДатаНачала);
Фильтры.Вставить("to", ПериодОтчета.ДатаОкончания);
ПараметрыЗапроса.Вставить("filter", Фильтры); // Начало периода
ПараметрыЗапроса.Вставить("limit", 1000);
ПараметрыЗапроса.Вставить("offset", offset);
ПараметрыЗапроса.Вставить("dir", "asc");
Добавки = Новый Соответствие;
Добавки.Вставить("analytics_data", Истина);
Добавки.Вставить("financial_data", Истина);
ПараметрыЗапроса.Вставить("with", Добавки); ПоказатьБиблиотека мне бахнет в урл with="Соответствие"&filter="Соответствие"
Разобрался, вместо
ДополнительныеПараметры.Вставить("ПараметрыЗапроса", ПараметрыЗапроса);
ДополнительныеПараметры.Вставить("JSON", ПараметрыЗапроса);
Если кто еще ОЗОН будет делать, то там надо вот так сделать, искать по Новый НастройкиСериализацииJSON. Fiddler'ом это дело отловил
НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
Может сможете подсказать: нужно пост запрос отправить, используя сертификат. Если делаю "классически", то все ок. Если использую коннектор - то говорит форбидден. Такую же ошибку можно получить если в постмане не указать сертификат.
Тоже самое можно повторить если в Коннектор добавить доп. параметр ПроверятьSSL=Ложь
Либо в вашем рабочем коде написать
SSL = Новый ЗащищенноеСоединениеOpenSSL(КлиентскийСертификатSSL, Новый СертификатыУдостоверяющихЦентровОС)
Не приходят данные формы на сервер, или может я что не так делаю
Данные = Новый Структура;
Данные.Вставить("comments", "Постучать в дверь");
Ответ = КоннекторHTTP.Post("http://httpbin.org/post", Данные);
На сервер эти данные не прилетают
Есть один вопрос, который не могу решить:
- Задача отправить в "form-data" файл, имя тега "file"
Я делаю вот так:
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "mutipart/form-data");
ДопПараметры = Новый Структура;
ДопПараметры.Вставить("Заголовки", Заголовки);
ДанныеФайла = Новый Структура("file", ФайлСсылка.ХранилищеДД.Получить()); //Тут получаем двоичные данные
Ответ = КоннекторHTTP.Post(АдресРесурса, ДанныеФайла, ДопПараметры); ПоказатьНо чтото не выходит. Если делаю через postman указав в теге 'file' что это именно файл и выбрав его на диске - ответ приходит корректный.
Что я делаю не так?
РАЗОБРАЛСЯ.
Аутентификация = Новый Структура;
Аутентификация.Вставить("Тип" , "AWS4-HMAC-SHA256");
Аутентификация.Вставить("ИдентификаторКлючаДоступа" , СтруктураВыполненияОбмена.КлючДоступа);
Аутентификация.Вставить("СекретныйКлюч" , СтруктураВыполненияОбмена.СекретныйКлюч);
Аутентификация.Вставить("Регион" , СтруктураВыполненияОбмена.Регион);
Аутентификация.Вставить("Сервис" , "sqs");
Аутентификация.Вставить("ИспользоватьАутентификациюОС" , Истина);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Аутентификация", Аутентификация);
Данные = Новый Структура;
Данные.Вставить("Action" , "ReceiveMessage");
ФлагУспешности = Истина;
ТекстОшибки = "";
Ответ = КоннекторHTTP.get(СтруктураВыполненияОбмена.АдресОчереди,Данные , ДополнительныеПараметры); ПоказатьФункция ИзвлечьExecution(Ответ)
HTML = КоннекторHTTP.КакТекст(Ответ);
Начало = СтрНайти(HTML, "name=""execution""");
Конец = СтрНайти(HTML, ">", НаправлениеПоиска.СНачала, Начало);
КороткаяСтрока = Сред(HTML, Начало, Конец - Начало);
Начало = СтрНайти(КороткаяСтрока, "value=""") + СтрДлина("value=""");
Конец = СтрНайти(КороткаяСтрока, """", НаправлениеПоиска.СНачала, Начало);
Возврат Сред(КороткаяСтрока, Начало, Конец - Начало);
КонецФункции ПоказатьНа стационарной платформе все ок, на смартфоне ошибка:
"The request signature we calculated does not match the signature you provided. Check your AWS secret access key and signing method. For more information, see REST Authentication and SOAP Authentication for details."
В цикле забыто начальное заполнение переменной ОшибкаВыполненияЗапроса
В тексте есть такая конструкция. Если запрос не выполнился, то заполняется ОшибкаВыполненияЗапроса и если задан повтор запроса, то он повторяется.
Пока Истина Цикл
ОшибкаВыполненияЗапроса = Неопределено; // Здесь ошибка.Не хватает вот этой строки
Попытка
Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
Исключение
ОшибкаВыполненияЗапроса = ИнформацияОбОшибке();
КонецПопытки;
Повтор = Повтор + 1;
Длительность = (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало) / МиллисекундВСекунде;
Если Не НеобходимоПовторитьЗапрос(Ответ, Настройки, ОшибкаВыполненияЗапроса) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ПоказатьДопустим, следующий запрос выполнился. Ответ 200, все хорошо. Но в в функции НеобходимоПовторитьЗапрос стоит такая проверка
Если ОшибкаВыполненияЗапроса <> Неопределено Тогда
Возврат Истина;
КонецЕсли;
А ОшибкаВыполненияЗапроса у нас заполнилось на предыдущем неудачном шаге и алгоритм вместо того чтобы прекратить проверку, вырабатывает все попытки и отваливается с первоначальной ошибкой.
У меня на проде используется какая-то из сборок коннектора, есть проблема когда значения get параметров не латинские буквы, например FirstName = ИВАН, есть строки в модуле:
ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.URLВКодировкеURL);
ЧастиПараметрыЗапроса.Добавить(СтрШаблон("%1=%2", Параметр.Ключ, ЗначениеПараметра));
первая строчка кодирует в url utf-8, все хорошо. А вот вторая преобразовывает кодированную строку до не узнаваемости, хотя насколько я понимаю во второй строке просто идет преобразование параметров из структуры в строку через =
Функция JsonВОбъект(Json, Кодировка = "utf-8", ПараметрыПреобразования = Неопределено) Экспорт
ПараметрыПреобразованияJSON = ДополнитьПараметрыПреобразованияJSON(ПараметрыПреобразования);
ЧтениеJSON = Новый ЧтениеJSON;
Если ТипЗнч(Json) = Тип("ДвоичныеДанные") Тогда
ЧтениеJSON.ОткрытьПоток(Json.ОткрытьПотокДляЧтения(), Кодировка);
ИначеЕсли ТипЗнч(Json) = Тип("Строка") Тогда
ЧтениеJSON.УстановитьСтроку(Json);
Иначе
ЧтениеJSON.ОткрытьПоток(Json, Кодировка);
КонецЕсли;
Объект = ПрочитатьJSON(
ЧтениеJSON,
ПараметрыПреобразованияJSON.ПрочитатьВСоответствие,
ПараметрыПреобразованияJSON.ИменаСвойствСоЗначениямиДата,
ПараметрыПреобразованияJSON.ФорматДатыJSON,
//VP+
ПараметрыПреобразованияJSON.ИмяФункцииВосстановления,
ПараметрыПреобразованияJSON.МодульФункцииВосстановления,
ПараметрыПреобразованияJSON.ДополнительныеПараметрыФункцииВосстановления,
ПараметрыПреобразованияJSON.ИменаСвойствДляОбработкиВосстановления);
//VP-
ЧтениеJSON.Закрыть();
Возврат Объект;
КонецФункции ПоказатьФункция ПараметрыПреобразованияJSONПоУмолчанию()
ПараметрыПреобразованияПоУмолчанию = Новый Структура;
ПараметрыПреобразованияПоУмолчанию.Вставить("ПрочитатьВСоответствие", Истина);
ПараметрыПреобразованияПоУмолчанию.Вставить("ФорматДатыJSON", ФорматДатыJSON.ISO);
ПараметрыПреобразованияПоУмолчанию.Вставить("ИменаСвойствСоЗначениямиДата", Неопределено);
//VP+
ПараметрыПреобразованияПоУмолчанию.Вставить("ИмяФункцииВосстановления", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("МодульФункцииВосстановления", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("ДополнительныеПараметрыФункцииВосстановления", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("ИменаСвойствДляОбработкиВосстановления", Неопределено);
//VP-
Возврат ПараметрыПреобразованияПоУмолчанию;
КонецФункции
ПоказатьПродолжение развития будет? Было бы круто увидеть Клиентский модуль с поддержкой ассинхронных вызовов HTTP
Можно взять самую актуальную версию, скопировав общий модуль
> Продолжение развития будет? Было бы круто увидеть Клиентский модуль с поддержкой ассинхронных вызовов HTTP
Можно писать в issue на github'е пожелания/вопросы
Думаю данную информацию нужно бы указать в ReadMe на GitHub. Так как это не очевидно.
Уточните момент с инициализацией дополнительных параметров. Например необходимо отправить более одного POST запроса на один и тот же ресурс с измененными данными в цикле:
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Аутентификация = Новый Структура;
Аутентификация.Вставить("Пользователь", "test");
Аутентификация.Вставить("Пароль", "test");
ПараметрыПреобразованияJSON = Новый Структура;
ПараметрыПреобразованияJSON.Вставить("ПрочитатьВСоответствие", Ложь);
ПараметрыЗаписиJSON = Новый Структура;
ПараметрыЗаписиJSON.Вставить("ПереносСтрок", ПереносСтрокJSON.Нет);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Заголовки", Заголовки);
ДополнительныеПараметры.Вставить("Аутентификация", Аутентификация);
ДополнительныеПараметры.Вставить("ПараметрыПреобразованияJSON", ПараметрыПреобразованияJSON);
ДополнительныеПараметры.Вставить("ПараметрыЗаписиJSON", ПараметрыЗаписиJSON);
Для Счетчик = 1 По 5 Цикл
СтруктураДанных = Новый Структура("id", Счетчик);
Ответ = КоннекторHTTP.PostJson("https://infostart.ru/", СтруктураДанных, ДополнительныеПараметры);
КонецЦикла; ПоказатьВо второй итерации в ДополнительныеПараметры.Данные остается первое значение {"id":1} и для отправки используется оно. Неужели для каждой итерации необходимо удалять свойство ДополнительныеПараметры.Данные для повторной загрузке данных в ЗаполнитьДополнительныеДанные() ?
ДополнительныеПараметры.Данные = Новый ДвоичныеДанные(Файл.ПолноеИмя);
Ответ = КоннекторHTTP.Put("https://mystorage.storage.yandexcloud.net/" + Файл.Имя, Неопределено, ДополнительныеПараметры);С тем, чтобы через odata получать в джейсоне - разобрался, невнимательно читал документацию. это параметр надо в заголовках передавать.
Но все таки есть ситуации что нужно в строке запроса передавать параметры.
Например, get запрос
Результат = КоннекторHttp.GetJson("http://127.0.0.1/basename/odata/standard.odata/Catalog_ФизическиеЛица(guid'910d4030-1234-11e6-80c6-8038bc045e37')?$select=*____Presentation")
Никак не могу победить отправку данных формы на один сайт.
Тестирую через Postman, там всё ок. А через 1С возвращает код 500.
Картинку с postman прилагаю. Так заголовки и тело запроса.
Не работающий код в 1С ниже:
// Заголовки
Заголовки = Новый Соответствие;
Заголовки.Вставить("accept-encoding", "gzip, deflate, br");
Заголовки.Вставить("cookie", "PHPSESSID=4b*******************u2");
Заголовки.Вставить("content-type", "multipart/form-data; boundary=----WebKitFormBoundary1tABMKavlQpONwZj");
// Данные формы
Данные = Новый Структура;
Данные.Вставить("parent_course_id", 28);
Данные.Вставить("action", "course");
Данные.Вставить("edit_name_parent_course", "Новое название!!");
Ответ = Коннектор.Post("https://np*******f.com/admin/action.php", , Новый Структура("Заголовки, Данные", Заголовки, Данные));
ПоказатьПробовал данные вставлять отдельно вторым параметром в функцию Post, результат тот же.
Помогите пожалуйста найти ошибку
....
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Заголовки", Заголовки);
ДополнительныеПараметры.Вставить("Аутентификация", Аутентификация);
ДополнительныеПараметры.Вставить("Таймаут", 300);
Ответ = КоннекторHTTP.Put("https://test.storage.yandexcloud.net/my_file.txt", Файл, ДополнительныеПараметры);
В функции put сначала формируются параметры по-умолчанию, а потом добавляются дополнительные параметры, которые мы передали
Функция Put(URL, Данные = Неопределено, ДополнительныеПараметры = Неопределено, Сессия = Неопределено) Экспорт
ТекущаяСессия = ТекущаяСессия(Сессия);
Параметры = НовыеПараметры();
Дополнить(Параметры, ПараметрыИзАргументов(Неопределено, Данные, Неопределено));
Дополнить(Параметры, ДополнительныеПараметры);
Возврат ВызватьHTTPМетод(ТекущаяСессия, "PUT", URL, Параметры);
КонецФункции
Функция Дополнить работает не совсем корректно: она проверяет, если в наших стандартных параметрах уже есть параметр с наименованием из дополнительных параметров, то имеющийся параметр никак не обновляется.
Мы же формируем доп. параметр с именем "Аутентификация", а такой параметр уже есть, он не обновляется и при в итоге наши параметры авторизации игнорируются.
Пока поправил у себя функцию таким образом:
Процедура Дополнить(Приемник, Источник)
Если Источник = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого ЭлементИсточника Из Источник Цикл
ПараметрНайден = Ложь;
Если ТипЗнч(Приемник) = Тип("Соответствие") Тогда
ПараметрНайден = Приемник.Получить(ЭлементИсточника.Ключ) <> Неопределено;
КонецЕсли;
Если ТипЗнч(Приемник) = Тип("Структура") Тогда
ПараметрНайден = Приемник.Свойство(ЭлементИсточника.Ключ);
КонецЕсли;
Если НЕ ПараметрНайден ИЛИ (ЭлементИсточника.Ключ = "Аутентификация" ИЛИ ЭлементИсточника.Ключ = "Заголовки") Тогда
Приемник.Вставить(ЭлементИсточника.Ключ, ЭлементИсточника.Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Запросы одинаковые , ответ в 1с через расширение
{
"group": null,
"id": 1,
"ip": "192.168.8.100",
"name": "1",
"reconnect_type": "time_link",
"type": "Huawei E3372h-153",
"conn_dev": true,
"reconnect_end_hum": "8 минут назад",
"ifname": "enp0s20f0u2u1u1",
"reconnect_min": 20,
"active": true,
"gateway": "192.168.8.1",
"is_osfp": true,
"rsrq": "-8dB",
"conn_net": true,
"conn_inet": false,
"reconnect": false,
"rssi": "-77dBm",
"reconnect_interval": 500,
"reconnect_start": "04 мар 2023 14:20:16",
"reconnect_end": "04 мар 2023 14:20:22",
"signal": 2,
"rsrp": "-106dBm",
"sinr": "2dB",
"operator": "MegaFon RUS",
"osfp": {
"id": 7,
"name": "SP3",
"modem": "Windows"
},
"network_type": "LTE",
"reconect_time": 7,
"external_ip": null,
"net_mode": "lte",
"monitoring_interval": 3,
"real_band": [
"B1",
"B3",
"B7",
"B8",
"B20"
}
]
ответ через постмана
[{"id":1,"name":"1","type":"Huawei E3372h-153","active":true,"ifname":"enp0s20f0u2u1u1","ip":"192.168.8.100","gateway":"192.168.8.1","conn_dev":true,"is_osfp":true,"conn_net":true,"conn_inet":false,"reconnect":false,"reconnect_type":"time_link","reconnect_interval":500,"reconnect_min":20,"reconnect_start":"04 мар 2023 14:20:16","reconnect_end":"04 мар 2023 14:20:22","reconnect_end_hum":"2 минуты назад","signal":2,"rsrq":"-9dB","rsrp":"-107dBm","rssi":"-77dBm","sinr":"1dB","osfp":{"id":7,"name":"SP3","modem":"Windows"},"operator":"MegaFon RUS","network_type":"LTE","reconect_time":388,"external_ip":null,"net_mode":"lte","monitoring_interval":3,"group":null,"real_band":["B1","B3","B7","B8","B20"]}]
Есть у кого-то идеи почему ?)
Пробовал разные форматы , один из , также отправлял просто post(боди отсуствует) и postjson , приходит абсолютно также.
Есть ли возможность указать не пробовать сериализировать ответ ?
ЗаголовокАвторизации = "Token "+Ключ;
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
Ответ = КоннекторHTTP.getjson("http://192.168.88.166:8000/api/devices/modem/list",,Новый Структура("Заголовки", Заголовки)); Показать
Вопрос снимаю , провалился дебагом , это модуль телеграмм для 1С пробует преобразовать прилетающий массив в json , и делает это кривовато. В дебаге ответ - массив , в нем соответствие , в соответствии все четенько.
Спасибо)
1с упорно ловит ответ 404, хотя в браузере отображается второй ответ 200 с содержимым JSON.
Проверял через Postman, Curl, они все ловят нормальный ответ с содержимым, а 1с нет.
Пробовал вызывать несколько раз метод, использовал GET и POST, подставлял различные заголовки.
Попробовал с использованием вашего модуля.
Разработчику сервиса сообщили, но решения ждать можно долго.
Подскажите, как можно обойти данную проблему?
curl -u identifier:secret \
-H "Content-Type: application/json; charset=utf-8" \
-X POST \
-d '{"response": {"payload": {"data": 111}}}' \
Делаю так
СтруктураPayload = Новый Структура;
СтруктураPayload .Вставить("data", 111);
СтруктураResponse = Новый Структура;
СтруктураResponse.Вставить("payload", СтруктураPayload);
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("response", СтруктураResponse);
ПараметрыПреобразованияJSON = Новый Структура("ПрочитатьВСоответствие", Ложь);
МассивПолейСТипомДата = ВернутьПоляДляПреобразованияВДату();
ПараметрыПреобразованияJSON.Вставить("ИменаСвойствСоЗначениямиДата", МассивПолейСТипомДата);
Аутентификация = Новый Структура("Пользователь, Пароль", "некий_user", "некий_password");
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Аутентификация", Аутентификация);
ДополнительныеПараметры.Вставить("ПараметрыПреобразованияJSON", ПараметрыПреобразованияJSON);
ДополнительныеПараметры.Вставить("Заголовки", Заголовки);
Json = БОНД_Коннектор.ОбъектВJson(СтруктураОтвета, ПараметрыПреобразованияJSON);
Результат = БОНД_Коннектор.PostJson("https://nekiy_server.ru/api/v1/services/incomings/13/responses", Json, ДополнительныеПараметры);
Верно ли я делаю?
curl -u identifier:secret --basic \
-H "Content-Type: application/json; charset=utf-8" \
-X POST \
-d '{"response": {"payload": {"data": 111}}}' \
Консоль транслирует в
ИдентификаторРесурса = "https://nekiy_server.ru/api/v1/services/incomings/13/responses";
ДополнительныеПараметры = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
ТелоЗапросаТекст = "{""response"": {""payload"": {""data"": 111}}}";
Ответ = Ждать КлиентHTTPКлиентСервер
.УстановитьЗаголовок(ДополнительныеПараметры, "Content-Type", "application/json; charset=utf-8")
.УстановитьBasicАвторизацию(ДополнительныеПараметры, "identifier", "***")
.ОтправитьТекст(ИдентификаторРесурса, ТелоЗапросаТекст, ДополнительныеПараметры);Если в "Ответ" требуется сразу получить структуру или соответствие (дессериализованный JSON), воспользуйтесь функцией "ТелоОтветаКакJSON".
Кстати, вашу строку curl я чуть-чуть изменил, добавив флаг "--basic" - особенность Клиента, но если это вам кажется критичным, буду рад вашему Pull реквесту. Либо однажды когда руки дойдут - поправлю.
При пустом ответе со статусом 200 не проверяется длина ответа. Раньше это относилось и к КакJason, но в более поздних версиях баг был исправлен, хотя, проверка на пустой ответ пока отсутствует и в КакТекст, и остальных функциях. Будет ли фикс в следующих версиях?
Пока дописаны свои проверки...
Спасибо за Коннектор!
Заголовки = Новый Соответствие;
Заголовки.Вставить("user-agent", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
Ответ = КоннекторHTTP.getjson("адрес",,Новый Структура("Заголовки", Заголовки));Бром (Brom) - это интеграционная компонента, которая предоставляет программный интерфейс взаимодействия (API) с информационными системами на базе 1С:Предприятие
По моему, очень интересная вещь
например кодируем строку "test"
ЗаписатьGZip возвращает
1F 8B 08 00 00 00 00 00 00 FF 74 65 73 74 0C 7E 7F D8 04 00 00 00
если упаковать в base64 получаем
H4sIAAAAAAAA/3Rlc3QMfn/YBAAAAA==
но онлайн-сервис потом эти данные считает некорректными.
кодированную другим онлайн сервисом строку
H4sIAAAAAAAAAypJLS4BAAAA//8DAAx+f9gEAAAA
воспринимает же нормально и раскодирует как
test
input_data= {
"request": {
"subject": "Unable to fetch mails",
"description": "I am unable to fetch mails from the mail server",
"requester": {
"id": "4",
"name": "administrator"
},
"impact_details": "Routine tasks are pending due to mail server problem",
"resolution": {
"content": "Mail Fetching Server problem has been fixed"
},
"status": {
"name": "Open"
}
}
}
Момент именно с параметром input_data= , те получается параметр , а в нем json
Напихать структур по типу
Данные = Новый Структура;
Данные.Вставить("input_data", request);
Не получается , ошибка парсинга . Через postman отрабатывает вот так
Пробовал и обычный post и postjson на всякий случай , структура получается корректная в отладке.
Не понял что ему не нравится , запихнул все в body, отработало
body = "
|{
| 'request': {
| 'subject':"+Тема+",
| 'description':"+Описание+",
| 'requester': {
| 'id': '18911',
| 'name': 'telegramBot'
| },
| 'status': {
| 'name': 'Открыто'
| },
| 'urgency': {
| 'name': "+Срочность+"
| },
| 'udf_fields': {
| 'udf_sline_301': 'high priority'
| },
| 'category': {
| 'name': "+Категория+"
| },
| 'subcategory': {
| 'name': "+Подкатегория+"
| },
| 'site': {
| 'name': "+Ресторан+"
| }
|
|
| }
|}";
ДанныеГотовые.Вставить("input_data", body);
Ещё (в теории) может может помочь
HTTPСоединение.ПолучитьЗаголовки(HTTPЗапрос);+
Ошибка такая :
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Переполнение стека встроенного языка на сервере
по причине:
ВнешняяОбработка.ОбменАСБ.Форма.Форма1.Форма : 14 : Результат = КоннекторHTTP.GetJson(
ОбщийМодуль.КоннекторHTTP.Модуль : 277 : Возврат КакJson(ВызватьHTTPМетод(ТекущаяСессия, "GET", URL, Параметры), ПараметрыПреобразованияJSON);
ОбщийМодуль.КоннекторHTTP.Модуль : 1290 : Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
ОбщийМодуль.КоннекторHTTP.Модуль : 1576 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
...
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1772 : Ответ = ОтправитьHTTPЗапрос(Сессия, ПодготовленныйЗапрос, Настройки);
ОбщийМодуль.КоннекторHTTP.Модуль : 1655 : ОбработкаОтветаСКодом401(Сессия, ПодготовленныйЗапрос, Настройки, Ответ);
ОбщийМодуль.КоннекторHTTP.Модуль : 1744 : Если ЭтоРедирект(Ответ.КодСостояния, Ответ.Заголовки) Тогда
ОбщийМодуль.КоннекторHTTP.Модуль : 1701 : КодыСостоянияHTTP = КодыСостоянияHTTP();
ОбщийМодуль.КоннекторHTTP.Модуль : 1112 : Для Каждого Описание Из ОписанияКодовСостоянийHTTP() Цикл
ОбщийМодуль.КоннекторHTTP.Модуль : 0
по причине:
Переполнение стека встроенного языка на сервере
Пример запроса GET - http://%адрес%/api/thirdparty/employees/events, передаю в теле
{
"from": "2025-03-11 10:00:00",
"to": "2025-03-11 15:20:00"
}
Подскажите как с помощью инструмента отправить такой запрос? В постман получаю json с ответом, а в 1С получаю просто страницу текстом.
ТекстЗапроса = "";
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("login", "login");
СтруктураЗапроса.Вставить("password", "password");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ТекстЗапроса = ЗаписьJSON.Закрыть();
Соединение = Новый HTTPСоединение("id.____.pro",,,,,, Новый ЗащищенноеСоединениеOpenSSL());
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Type","application/json; charset=utf-8");
ЗапросHTTP = Новый HTTPЗапрос("/api/v1/login", ЗаголовокЗапросаHTTP);
ЗапросHTTP.УстановитьТелоИзСтроки(ТекстЗапроса);
РезультатСоединения = Соединение.ВызватьHTTPМетод("POST", ЗапросHTTP);
Тело = РезультатСоединения.ПолучитьТелоКакСтроку();
Если РезультатСоединения.КодСостояния<>200 Тогда
КонецЕсли; ПоказатьТаким образом, неправильно:
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + """".xml"""";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);Если по каким-то причинам прикладной код не удалит созданный файл (например, между блоками создания и удаления временного файла возникнет штатное или нештатное исключение), этот файл так и останется в каталоге временных файлов.
Правильно:
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла(""""xml"""");
Данные.Записать(ИмяПромежуточногоФайла);Так же следует обратить внимание на удаление временных файлов и каталогов после их использования (КаталогВФ)
Если требуется создать временный каталог, необходимо воспользоваться конструкцией
КаталогВФ = ПолучитьИмяВременногоФайла();
СоздатьКаталог(КаталогВФ);По окончании работы с созданным каталогом, его необходимо удалить"""
ПроксиПоУмолчанию = Новый ИнтернетПрокси;
// BSLLS:ExecuteExternalCodeInCommonModule-off
ИмяОМПолученияФайловБСП = "ПолучениеФайловИзИнтернета";
СтруктураURL = РазобратьURL(URL);
Модуль = Общегоназначения.ОбщийМодуль(ИмяОМПолученияФайловБСП);
ПроксиПоУмолчанию = Модуль.ПолучитьПрокси(СтруктураURL.Схема);
// BSLLS:ExecuteExternalCodeInCommonModule-on
Возврат ПроксиПоУмолчанию;
КонецФункции
Столкнулся с Вашим коннектором. Есть вопрос, у Вас в случае редиректа запроса не всегда устанавливается тело запроса. Например при ошибке 302 это не происходит. Я у себя принудительно сделал заполнение. Однако не могу понять, может Вы специально так сделали?
Вот код расширения для исправления, чтобы было понятнее о чем речь:
ПодготовитьЗапросДляРедиректа |
|---|
&ИзменениеИКонтроль("ПодготовитьЗапросДляРедиректа")
Процедура расш1_ПодготовитьЗапросДляРедиректа(Сессия, ПодготовленныйЗапрос, ПеренаправленныйОтвет)
КодыСостоянияHTTP = КодыСостоянияHTTP();
НовыйURL = СформироватьНовыйURLПриПеренаправлении(ПеренаправленныйОтвет);
ПодготовленныйЗапрос.URL = КодироватьСтроку(НовыйURL, СпособКодированияСтроки.URLВКодировкеURL);
НовыйHTTPЗапрос = Новый HTTPЗапрос(СобратьАдресРесурса(РазобратьURL(НовыйURL), Новый Соответствие));
ПереопределитьМетод(ПодготовленныйЗапрос, ПеренаправленныйОтвет);
Если ПеренаправленныйОтвет.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307
И ПеренаправленныйОтвет.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
Иначе
#Удаление
ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
#КонецУдаления
КонецЕсли;
#Вставка
//При редиректе тело запроса очищалось, если ошибка была 302.
//Не понимаю в каких ситуациях надо повторять запрос без тела, поэтому вынес из условия.
ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
#КонецВставки
ПодготовленныйЗапрос.HTTPЗапрос = НовыйHTTPЗапрос;
УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "cookies");
ПодготовленныйЗапрос.Cookies = ОбъединитьCookies(ПодготовленныйЗапрос.Cookies, Сессия.Cookies);
ПодготовитьCookies(ПодготовленныйЗапрос);
КонецПроцедуры
Показать |
ПараметрыПреобразования = Новый Структура;
ПараметрыПреобразования.Вставить("ПрочитатьВСоответствие", Ложь);
ДополнительныеПараметры = Новый Структура("ПараметрыПреобразованияJSON", ПараметрыПреобразования);
КоннекторHTTP.GetJson(URL, , ДополнительныеПараметры);
Request body
[
{
"productId": 0,
"available": true,
"deliverable": true,
"Цена в копейках": 0
}
{
"productId": 22,
"available": true,
"deliverable": true,
"Цена в копейках": 155.00
}
]
ПоказатьЕсть небольшое предложение пофиксить такой момент: некоторые API исполняют параметры запроса типа "employee_ids[]=153689". И вот тут перестает работать потому что структура не поддерживает квадратные скобки.
Я то для себя поправил, но кому-то может сильно нужно будет
Для Каждого Значение Из Значения Цикл
// добавил:
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Значение = XMLСтрока(Истина);
КонецЕсли;
// конец добавления
ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
ЧастиПараметрыЗапроса.Добавить(СтрШаблон("%1=%2", Параметр.Ключ, ЗначениеПараметра));
КонецЦикла;
Показатьбез этого, в URL вместо "parametr=true" получалось "parametr=%D0%94%D0%B0" :(
Кидаю post запрос из источника в базу-приемнику
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Результат = httpКоннектор.POST("мой адрес",СтрокаJSON, Новый Структура("Заголовки", Заголовки)); В базе-приемнике
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
МассивСтрок = ПрочитатьJSON(ЧтениеJSON, Ложь); ...далее непереводимая игра слова со своим модулем данных....
Возвращаю некую структуру Ответ с ключами "Код" и "Сообщение"
ЗаписьJSON = новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Ответ);
СтрокаJSON = ЗаписьJSON.Закрыть();
Возврат СтрокаJSON;В источник данные прилетают, но не в той кодировке. ЧЯДНТ?
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 709325
Создание 31.01.19 00:26
Обновление 27.12.21 03:10
Просмотры 185327
Загрузки 516
Рейтинг
1069
Комментарии 307
Код открыт Да
Рубрики Инструментарий разработчика
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)