vbondarevsky / Connector

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
Apache License 2.0
638 stars 207 forks source link

Метод Post и передача JSON #91

Closed bapho-bush closed 10 months ago

bapho-bush commented 3 years ago

Правильно ли я понимаю, что в версии 2.3.1 единственная возможность вызвать метод Post и отправить в теле запроса JSON - указать явно значение свойства Json в структуре дополнительных параметров. То есть:

ДополнительныеПараметры = Новый Структура();
ДополнительныеПараметры.Json = Новый Соответствие("Ключ", "Значение");
Ответ = КоннекторHTTP.Post("https://github.com/", Неопределено, ДополнительныеПараметры);

Хотелось бы иметь возможность указывать JSON без взаимодействия со структурой доп. параметров. На мой взгляд, явное указание свойства Json - неправильно потому что, судя по коду, есть специальный метод, заполняющий параметр JSON, исходя из входных параметров. Явное указание свойства выглядит как вмешательство в приватное API.

Один из возможных вариантов решения - в сигнатуру метода Post и добавить возможность передавать коллекцию для сериализации в JSON, далее этот параметр передавать в ЗаполнитьДополнительныеПараметры.

Например:

Функция Post(URL, Данные = Неопределено, Json = Неопределено, ДополнительныеПараметры = Неопределено, Сессия = Неопределено) Экспорт

        ТекущаяСессия = ТекущаяСессия(Сессия);
    ЗаполнитьДополнительныеДанные(ДополнительныеПараметры, Неопределено, Данные, Json);
    Возврат ВызватьHTTPМетод(ТекущаяСессия, "POST", URL, ДополнительныеПараметры);

КонецФункции
zeegin commented 2 years ago

Обратно не совместимое изменение. Это плохо для всех кто уже использует.

Мне впринципе не нравится идея когда функция Post берет на себя слишком много. Я считаю она не должна заниматься сериализацией в Json данных тела, но она может этим заниматься если мы указали нужный заголовок в параметрах и передали данные как структуру или массив или соответствие.

В целом мне явный синтаксис когда сериализация происходит наглядно нарвится больше.

Ответ = КоннекторHTTP.Post("http://ya.ru", КоннекторHTTP.ОбъектВJson(Пакет));
bapho-bush commented 2 years ago

Обратно не совместимое изменение. Это плохо для всех кто уже использует.

Да, и мне это тоже не нравится. Но лаконичные варианты, не ломающие обратную совместимость, я найти не смог. Может есть какие-то предложения, кроме альтернативного API с явной сериализацией?

В целом мне явный синтаксис когда сериализация происходит наглядно нарвится больше.

Как я вижу по коду, уже есть устоявшееся решение, что методы Post/Get/etc берут на себя ответственность по сериализации, но делают это по каким-то не понятным мне правилам. Явное указание того, что попадёт в тело запроса, имхо, тоже вполне себе вариант. Добавить в конец методов необязательный параметр Тело, и проверять заполнен ли он. Заполнен? Вставляем "как есть" в запрос. Нет? Пляшем по существующей логике.

zeegin commented 2 years ago

Структура в Тело может быть сериализована как Json, как параметры формы, как xml, и еще хрен знает как. Под каждый вариант делать отдельные параметры не хочется.

В Python Requests это обыграно именными параметрами, но в 1С такого нет. Потому отсчитывать запятые - не самое элегантное решение.

Потому я считаю лучше когда метод Post ничего не сериализует либо делает это по алгоритму данных формы. Если же что-то в тело положили, то метод берёт на себя работу попытки вычислить хеадеры типа контента. А всю Сериализацию отдавать на откуп разработчика чтобы он ее вызывал явно

sagittarius-s commented 1 year ago

В целом мне явный синтаксис когда сериализация происходит наглядно нарвится больше.

Ответ = КоннекторHTTP.Post("http://ya.ru", КоннекторHTTP.ОбъектВJson(Пакет));

В версии 2.4.8 в таком случае ещё требуется явное указание заголовка Content-Type равное application/json. Иначе подставится application/x-www-form-urlencoded