Connector
Connector copied to clipboard
Метод Post и передача JSON
Правильно ли я понимаю, что в версии 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, ДополнительныеПараметры);
КонецФункции
Обратно не совместимое изменение. Это плохо для всех кто уже использует.
Мне впринципе не нравится идея когда функция Post берет на себя слишком много. Я считаю она не должна заниматься сериализацией в Json данных тела, но она может этим заниматься если мы указали нужный заголовок в параметрах и передали данные как структуру или массив или соответствие.
В целом мне явный синтаксис когда сериализация происходит наглядно нарвится больше.
Ответ = КоннекторHTTP.Post("http://ya.ru", КоннекторHTTP.ОбъектВJson(Пакет));
Обратно не совместимое изменение. Это плохо для всех кто уже использует.
Да, и мне это тоже не нравится. Но лаконичные варианты, не ломающие обратную совместимость, я найти не смог. Может есть какие-то предложения, кроме альтернативного API с явной сериализацией?
В целом мне явный синтаксис когда сериализация происходит наглядно нарвится больше.
Как я вижу по коду, уже есть устоявшееся решение, что методы Post/Get/etc берут на себя ответственность по сериализации, но делают это по каким-то не понятным мне правилам. Явное указание того, что попадёт в тело запроса, имхо, тоже вполне себе вариант. Добавить в конец методов необязательный параметр Тело
, и проверять заполнен ли он. Заполнен? Вставляем "как есть" в запрос. Нет? Пляшем по существующей логике.
Структура в Тело может быть сериализована как Json, как параметры формы, как xml, и еще хрен знает как. Под каждый вариант делать отдельные параметры не хочется.
В Python Requests это обыграно именными параметрами, но в 1С такого нет. Потому отсчитывать запятые - не самое элегантное решение.
Потому я считаю лучше когда метод Post ничего не сериализует либо делает это по алгоритму данных формы. Если же что-то в тело положили, то метод берёт на себя работу попытки вычислить хеадеры типа контента. А всю Сериализацию отдавать на откуп разработчика чтобы он ее вызывал явно
В целом мне явный синтаксис когда сериализация происходит наглядно нарвится больше.
Ответ = КоннекторHTTP.Post("http://ya.ru", КоннекторHTTP.ОбъектВJson(Пакет));
В версии 2.4.8 в таком случае ещё требуется явное указание заголовка Content-Type
равное application/json
. Иначе подставится application/x-www-form-urlencoded