Connector icon indicating copy to clipboard operation
Connector copied to clipboard

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

Open bapho-bush opened this issue 3 years ago • 3 comments

Правильно ли я понимаю, что в версии 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, ДополнительныеПараметры);

КонецФункции

bapho-bush avatar Oct 08 '21 11:10 bapho-bush

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

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

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

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

zeegin avatar Nov 17 '21 07:11 zeegin

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

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

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

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

bapho-bush avatar Nov 17 '21 07:11 bapho-bush

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

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

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

zeegin avatar Nov 17 '21 07:11 zeegin

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

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

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

sagittarius-s avatar Oct 19 '23 12:10 sagittarius-s