vbondarevsky / Connector

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

Функции типа Post изменяют входной параметр ДополнительныеПараметры #123

Open 7orlum opened 1 year ago

7orlum commented 1 year ago

Функция Post и подобные модифицирует свой входной параметр ДополнительныеПараметры, используя его для своих внутренних целей, и эти изменения протекают в код, вызывающий эту функцию. Это мешает использовать значение ДополнительныеПараметры повторно. Например, в коде ниже второй запрос возвращает неожиданный результат, потому что при первом вызове КоннекторHTTP.Post добавил значение Данные в ДополнительныеПараметры. При втором вызове КоннекторHTTP.Post, получив те же самые ДополнительныеПараметры, но другие Данные, отправит на хост неверные устаревшие Данные, потому что возьмет предыдущее значение, сохраненное в ДополнительныеПараметры. Это неожиданное поведение функции, не видел чтобы где-то было предупреждение, что ДополнительныеПараметры нельзя переиспользовать.

Функция СписокИзменений(ИдентификаторСессии)
    Перем Адрес;
    Перем Заголовки;
    Перем ДополнительныеПараметры;
    Перем Данные;

    Адрес = "https://online.sbis.ru/service/?srv=1";

    Заголовки = Новый Соответствие();
    Заголовки.Вставить("X-SBISSessionID", ИдентификаторСессии);
    Заголовки.Вставить("Content-Type", "application/json-rpc;charset=utf-8");
    Заголовки.Вставить("User-Agent", "hello");

    ДополнительныеПараметры = Новый Структура();
    ДополнительныеПараметры.Вставить("МаксимальноеКоличествоПовторов", 5);
    ДополнительныеПараметры.Вставить("Заголовки", Заголовки);

    Результат = "";

    Данные = 
        "{
        |  ""jsonrpc"": ""2.0"",
        |  ""method"": ""СБИС.СписокИзменений"",
        |  ""params"": {
        |     ""Фильтр"": {
        |        ""ДатаВремяС"": ""18.08.2023 00.00.00"",
        |        ""Навигация"": {
        |           ""РазмерСтраницы"": 50
        |        },
        |        ""ПолныйСертификатЭП"": ""Нет""
        |     }
        |  },
        |  ""id"": 0
        |}";

    Пока Истина Цикл
        Ответ = КоннекторHTTP.Post(Адрес, Данные, ДополнительныеПараметры);
        Результат = Результат + КоннекторHTTP.КакТекст(Ответ);

        JsonОтвет = КоннекторHTTP.КакJson(Ответ);
        Если Не JsonОтвет["result"]["Навигация"]["ЕстьЕще"] Тогда
            Прервать;
        КонецЕсли;

        Данные = СтрШаблон(
            "{
            |  ""jsonrpc"": ""2.0"",
            |  ""method"": ""СБИС.СписокИзменений"",
            |  ""params"": {
            |     ""Фильтр"": {
            |        ""ИдентификаторСобытия"": ""%1"",
            |        ""ИдентификаторДокумента"": ""%2"",
            |        ""Навигация"": {
            |           ""РазмерСтраницы"": 50
            |        },
            |        ""ПолныйСертификатЭП"": ""Нет""
            |     }
            |  },
            |  ""id"": 0
            |}",
            ПоследнийЭлемент(ПоследнийЭлемент(JsonОтвет["result"]["Документ"])["Событие"])["Идентификатор"],
            ПоследнийЭлемент(JsonОтвет["result"]["Документ"])["Идентификатор"]);
        //без следующей строки запрос возвращает те же самые данные вместо следующей порции
        //все потому КоннекторHTTP.Post добавил Данные в ДополнительныеПараметры, и измененные их туда уже не вставит
        ДополнительныеПараметры.Вставить("Данные", Данные);
    КонецЦикла;

    Возврат Результат;
КонецФункции