Как сделать Post запрос и передать массив данных

0 голосов
Андрей АВ в категории Интеграция

Добрый день.

Я создал в Loginom web-сервис:
HTTP Метод: POST

пример текста запроса Json:

{ "DataSet": { "Rows": [ {}, {} ] } }

Как мне передать в узле "Rest-запрос" таблицу с полями FILE_NAME, FILE_ID, FILE_EXT? И просьба пояснить как в JS узле передать всю таблицу  в "DataSet" ?

Ответ: 1 шт.

0 голосов
tatyana.pavlova
Для заполнения DataSet в JSON можно использовать следующий подход:

1. На первый табличный порт узла JavaScript подать таблицу с нужными полями (FILE_NAME, FILE_ID, FILE_EXT).

2. В мастере настройки узла JavaScript добавить выходное поле, например, "json", который будет содержать текст запроса для веб-сервиса.

3. Для формирования результата использовать OutputTable с одним строковым полем, куда будет записываться готовый JSON для тела POST‑запроса.​

4. Через InputTables[0] в цикле пройти все строки, на каждую строку собрать объект с тремя полями (FILE_NAME, FILE_ID, FILE_EXT) и добавить эти объекты в массив.​

5. На основе массива объектов сформировать объект вида { DataSet: { Rows: [...] } } и сериализовать его через JSON.stringify.​

Как связать с REST‑запросом?

1. Узел JavaScript подключить перед узлом «REST‑запрос» и передать в него текст JSON-запроса, который сформировали в узле JavaScript.​

2. В настройке «REST‑запроса» для метода POST выбрать в качестве "Поля с телом запроса", поле, созданное на предыдущем шаге.​
Андрей АВ
Надо ли передавать наименования полей в DataSet, параметры полей?
tatyana.pavlova
Если вы хотите передать таблицу с полями FILE_NAME, FILE_ID, FILE_EXT в качестве массива в Rows в DataSet, то надо сформировать каждую строку массива Rows как объект, содержащий ключ-значение, где ключ - название поля,

а значение - значение поля, т.е. каждая строка в массиве Rows должна представлять собой объект следующего вида:

{

  "FILE_NAME": "example.pdf",

  "FILE_ID": "123456789",

  "FILE_EXT": ".pdf"

}

Соответственно, итоговый JSON для тела запроса будет иметь вид:

{

  "DataSet": {

    "Rows": [

      {

        "FILE_NAME": "example1.pdf",

        "FILE_ID": "111",

        "FILE_EXT": ".pdf"

      },

      {

        "FILE_NAME": "example2.docx",

        "FILE_ID": "222",

        "FILE_EXT": ".docx"

      }

      // и так далее по числу строк входной таблицы

    ]

  }

}

Такой формат корректно укладывается в общую схему DataSet/Rows, которую ожидает веб‑сервис при POST‑запросе.
Андрей АВ

Утоните, пожалуйста, с чем может быть связана ошибка.

Я создал JSON строку {"DataSet":{"Rows":[{"FILE_NAME":" ....
Пробую в JS  узле вызвать web-сервис loginom получаю ошибку 

{

  "type": "https://tools.ietf.org/html/rfc9110#section-15.6.1",

  "title": "An error occurred while processing your request.",

  "status": 500,

  "detail": "При активизации узлов возникла ошибка",

  "inner": {

    "message": "Порт \"Таблица 2\" не настроен"

  }

}


Код модуля JS 

let url  =  InputVariables.Items[0].Value;

let json_data = InputTables[0].Get(0,0);

// Создание объекта заголовков запроса:

let headers = new Headers({"Content-Type": "application/json"})

// Создание объекта запроса:

let request = new Request(url, {

                method: "post",

                headers: headers,

    body: json_data

                });

let response_text = "";

(async() => {

    try {

        let response = await fetch(request);

        let response_text = await response.text();

        let response_status = response.status;

         

        let array = [];

        array.push({Name: 'status', DisplayName: 'status', DataType: DataType.String, DefaultUsageType: UsageType.Active});

        array.push({Name: 'response', DisplayName: 'response', DataType: DataType.String, DefaultUsageType: UsageType.Active});

        // Добавление массива столбцов

        OutputTable.AssignColumns(array);

        // Добавление строки в выходной набор данных

        OutputTable.Append();

        OutputTable.Set(0, response_status);

        OutputTable.Set(1, response_text);

    } catch(e) {

        console.log(e);

    }

})();

Андрей АВ
Понял в чем дело, важно чтобы в узле web-сервисе на входящем порту были настроены поля. Если поля были определены автоматически, то при удалении связи между узлами и сохранении, web-сервис очистит информацию во входящем порту.

Видимо есть два варианта

1) на входящем порту настроить какие поля он ожидает

2) доп узел с полями и связать его с узлом web-сервис, чтобы автоматически были настроены
...