Часто задаваемые вопросы

Что будет, если забыли написать нужный ResultName?

Проверим что будет, если при составлении pipeline валидации, не указать resultName.
У нас есть данные вида:
firstsecond
225
15
12
0
  1. Создаем профиль с RuleName: 'min'. Хотим, чтобы он выбрал минимальное значение среди имеющихся колонок.
    profile.json type=json
    {
      "profileId": "e34dc8c8-48f2-4aa5-9e36-f7a9415f84e0",
      "profileName": "calculatedFieldNotPersistTest",
      "columns": [
        {
          "columnName": "first",
          "type": "STRING",
          "position": 0,
          "required": false,
          "calculatedField": false
        },
        {
          "columnName": "second",
          "type": "STRING",
          "position": 1,
          "required": false,
          "calculatedField": false
        }
      ],
      "validationRules": [
        {
          "ruleName": "min",
          "values": [
            {
              "source": "TABLE",
              "key": "first"
            },
            {
              "source": "TABLE",
              "key": "second"
            }
          ],
          "ruleType": "CALCULATED_FIELD"
        }
      ],
      "csvSeparator": "\u0000",
      "skipRowsFromStart": 0,
      "skipRowsFromEnd": 0
    }
    
  2. Отправляем запрос с данными для начала парсинга.
    PartDescription
    file
    Файл для загрузки
    dictionaryCode
    Код справочника
    dictionaryName
    Название справочника
    profileId
    ID профиля
    taskType
    Тип загрузки. Для примера выбрано TaskType.DEMO
    Curl type=json
    $ curl 'http://localhost:8080/now/profile' -i -X POST \
     -H 'Content-Type: multipart/form-data;charset=UTF-8' \ -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e0' \ -F 'taskType=DEMO' \
    -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e0' \ -F 'taskType=DEMO'
    ID которое мы получаем в ответ, ID задания 721edcb1-4354-4d35-8943-b39c8150eb06
    Отправляем запрос для получения данных
    $ curl 'http://localhost:8080/now/721edcb1-4354-4d35-8943-b39c8150eb06/data' -i -X GET \
    -H 'Content-Type: application/json;charset=UTF-8'
    
  3. Получаем ответ.
    Response type=json
     {
      "dictionaryCode" : "ANY",
    "versionCode"
    "versionName"
    "subsystem" :
    "items" : [ {
    : "INIT_1_2021_09_08_19_46_26_902",
    : "VER.INIT_1_2021_09_08_19_46_26_902", "DICTIONARY_AUTO_UPLOAD",
    "attrs" : {
      "code" : "0",
      "first" : "225",
      "second" : "15"
    } }, {
    "attrs" : {
      "code" : "1",
      "first" : "12",
      "second" : "0"
    } } ],
    "dictionaryMultiData" : null
    }
    
Как можем наблюдать, вычисленное значение не записалось в БД. Такие случаи удобны при последовательной валидации.

Как реализовать последовательную валидацию данных?

Последовательная валидация данных: профиль колонками A, B, C. Необходимо получить сумму этих колонок, разделить на 10, а потом посмотреть, результат меньше числа 10 или нет.
У нас есть данные вида:
ABC
225
1560
Чтобы брать значения из уже вычисленных полей по resultName, надо поставить тип source : ENV.
  1. Создаем профиль.
    profile.json type=json
    {
      "profileId": "e34dc8c8-48f2-4aa5-9e36-f7a9415f84e8",
      "profileName": "rulesChainTest",
      "columns": [
        {
          "columnName": "A",
          "type": "STRING",
          "position": 0,
          "required": false,
          "calculatedField": false
        },
        {
          "columnName": "B",
          "type": "STRING",
          "position": 1,
          "required": false,
          "calculatedField": false
        },
        {
          "columnName": "C",
          "type": "STRING",
          "position": 1,
          "required": false,
          "calculatedField": false
        }
      ],
      "validationRules": [
        {
          "ruleName": "sum",
          "values": [
            {
              "source": "TABLE",
              "key": "A"
            },
            {
              "source": "TABLE",
              "key": "B"
            },
            {
              "source": "TABLE",
              "key": "C"
            }
          ],
          "resultName": "sumOfABC",
          "ruleType": "CALCULATED_FIELD"
        },
        {
          "ruleName": "div",
          "values": [
            {
              "source": "ENV",
              "key": "sumOfABC"
            },
            {
              "source": "CONSTANT",
              "key": "10"
            }
          ],
          "resultName": "divOfSum",
          "ruleType": "CALCULATED_FIELD"
        },
        {
          "ruleName": "isMin",
          "values": [
            {
              "source": "ENV",
              "key": "sumOfABC"
            },
            {
              "source": "CONSTANT",
              "key": "10"
            }
          ],
          "ruleType": "CHECKER"
        }
      ],
      "csvSeparator": "\u0000",
      "skipRowsFromStart": 0,
      "skipRowsFromEnd": 0
    }
    
  2. Отправляем запрос с данными для начала парсинга.
    PartDescription
    file
    Файл для загрузки
    dictionaryCode
    Код справочника
    dictionaryName
    Название справочника
    profileId
    ID профиля
    taskType
    Тип загрузки. Для примера выбрано TaskType.DEMO
    Curl type=json
    $ curl 'http://localhost:8080/now/profile' -i -X POST \
    -H 'Content-Type: multipart/form-data;charset=UTF-8' \ -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e8' \ -F 'taskType=DEMO' \
    -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e8' \ -F 'taskType=DEMO'
    
  3. Получаем в ответ ID задания.
    eba5fbd2-2d8d-4ff9-ad5a-6d2704d71e85
  4. Отправляем запрос для получения данных.
    Curl type=json
    $ curl 'http://localhost:8080/now/eba5fbd2-2d8d-4ff9-ad5a-6d2704d71e85/data' -i -X GET \
    -H 'Content-Type: application/json;charset=UTF-8'
    
  5. Получаем ответ.
    Response type=json
    {
      "type": "Your request file didn't validate with your validation rules",
      "title": "Validation Exception",
      "invalidParams": [
        {
          "rowIndex": 0,
          "ruleName": "isMin",
          "field": "",
          "message": "false"
        }
      ],
      "error": null,
      "messageChain": null
    }
    
В ответе пришло пояснение об ошибке валидации, так как 30 больше, чем 10.

Что будет, если указать неправильное имя колонки?

Проверим случай, если случайно ошиблись регистром.
У нас есть данные вида:
ABC
225
1560
  1. Создаем профиль, в котором ошиблись и вместо 'C' написали 'c'.
    profile.json type=json
    {
      "profileId": "e34dc8c8-48f2-4aa5-9e36-f7a9415f84e6",
      "profileName": "rulesChainTest",
      "columns": [
        {
          "columnName": "A",
          "type": "STRING",
          "position": 0,
          "required": false,
          "calculatedField": false
        },
        {
          "columnName": "B",
          "type": "STRING",
          "position": 1,
          "required": false,
          "calculatedField": false
        },
        {
          "columnName": "C",
          "type": "STRING",
          "position": 1,
          "required": false,
          "calculatedField": false
        }
      ],
      "validationRules": [
        {
          "ruleName": "sum",
          "values": [
            {
              "source": "TABLE",
              "key": "A"
            },
            {
              "source": "TABLE",
              "key": "B"
            },
            {
              "source": "TABLE",
              "key": "c"
            }
          ],
          "resultName": "sumOfABC",
          "ruleType": "CALCULATED_FIELD"
        }
      ],
      "csvSeparator": "\u0000",
      "skipRowsFromStart": 0,
      "skipRowsFromEnd": 0
    }
    
  2. Отправляем запрос с данными для начала парсинга.
    PartDescription
    file
    Файл для загрузки
    dictionaryCode
    Код справочника
    dictionaryName
    Название справочника
    profileId
    ID профиля
    taskType
    Тип загрузки. Для примера выбрано TaskType.DEMO
    Curl type=json
    $ curl 'http://localhost:8080/now/profile' -i -X POST \
    -H 'Content-Type: multipart/form-data;charset=UTF-8' \ -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e6' \ -F 'taskType=DEMO' \
    -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e6' \ -F 'taskType=DEMO'
    
  3. Получаем в ответ ID задания.
    73136df9-14cf-496d-a39c-e5094d3fd2fa
  4. Отправляем запрос для получения данных.
    Curl type=json
    $ curl 'http://localhost:8080/now/73136df9-14cf-496d-a39c-e5094d3fd2fa/data' -i -X GET \
    -H 'Content-Type: application/json;charset=UTF-8'
    
  5. Получаем ответ.
    Response type=json
    {
    "type" : "Your request file didn't validate with your validation rules",
    "title" : "Validation Exception",
    "invalidParams" : [ {
    "rowIndex" : 0,
    "ruleName" : "sum",
    "field" : "",
    "message" : "Не были найдены указанные в правилах данные. Пожалуйста, проверьте
    корректность правила и повторите попытку" } ],
    "error" : null,
    "messageChain" : null
    }
    
Как можем наблюдать, выдается ошибка валидации, так как колонки не было найдено во время выполнения правила 'sum'.

Что будет, если выбрать колонку не с тем типом, который нужен?

Проверим случай, если случайно перепутали колонки.
Исходные данные:
num1num2String
50
50"string"
  1. Создаем профиль в котором ошиблись и вместо колонки 'num2' написали 'String'.
    profile.json type=json
    {
      "profileId": "e34dc8c8-48f2-4aa5-9e36-f7a9415f84e5",
      "profileName": "incorrectValuesDataTypeTest",
      "columns": [
        {
          "columnName": "num1",
          "type": "STRING",
          "position": 0,
          "required": false,
          "calculatedField": false
        },
        {
          "columnName": "num2",
          "type": "STRING",
          "position": 1,
          "required": false,
          "calculatedField": false
        },
        {
          "columnName": "String",
          "type": "STRING",
          "position": 2,
          "required": false,
          "calculatedField": false
        }
      ],
      "validationRules": [
        {
          "ruleName": "sum",
          "values": [
            {
              "source": "TABLE",
              "key": "num1"
            },
            {
              "source": "TABLE",
              "key": "String"
            }
          ],
          "resultName": "sum",
          "ruleType": "CALCULATED_FIELD"
        }
      ],
      "csvSeparator": "\u0000",
      "skipRowsFromStart": 0,
      "skipRowsFromEnd": 0
    }
    
  2. Отправляем запрос с данными для начала парсинга.
    PartDescription
    file
    Файл для загрузки
    dictionaryCode
    Код справочника
    dictionaryName
    Название справочника
    profileId
    ID профиля
    taskType
    Тип загрузки. Для примера выбрано TaskType.DEMO
    Curl type=json
    $ curl 'http://localhost:8080/now/profile' -i -X POST \
    -H 'Content-Type: multipart/form-data;charset=UTF-8' \ -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e5' \ -F 'taskType=DEMO' \
    -F 'file=@data.json' \
    -F 'dictionaryCode=any' \
    -F 'dictionaryName=any' \
    -F 'profileId=e34dc8c8-48f2-4aa5-9e36-f7a9415f84e5' \ -F 'taskType=DEMO'
    
  3. Получаем в ответ ID задания.
    682026d2-2160-44f1-9642-6ba2f510c292
  4. Отправляем запрос для получения данных.
    Curl type=json
    $ curl 'http://localhost:8080/now/682026d2-2160-44f1-9642-6ba2f510c292/data' -i -X GET \
    -H 'Content-Type: application/json;charset=UTF-8'
    
  5. Получаем ответ.
    Response type=json
    {
      "type": "Your request file didn't validate with your validation rules",
      "title": "Validation Exception",
      "invalidParams": [
        {
          "rowIndex": 0,
          "ruleName": "sum",
          "field": "",
          "message": "NumberFormatException: For input string: \"string\""
        }
      ],
      "error": null,
      "messageChain": null
    }
    
В результате получим ошибку валидации, так как колонки неправильного типа для выполнения правила 'sum'.

Что будет, если указано неправильное название правила валидации?

Проверим случай, если случайно допустили ошибку в названии правила валидации.
  1. Создаем профиль, в котором ошиблись и вместо правила 'isEmail' написали 'isEmmail'.
    profile.json type=json
    {
      "profileId": "e34dc8c8-48f2-4aa5-9e36-f7a9415f84e4",
      "profileName": "incorrectRuleNameTest",
      "columns": [
        {
          "columnName": "A",
          "type": "STRING",
          "position": 0,
          "required": false,
          "calculatedField": false
        }
      ],
      "validationRules": [
        {
          "ruleName": "isEmmail",
          "values": [
            {
              "source": "TABLE",
              "key": "A"
            }
          ],
          "ruleType": "CHECKER"
        }
      ],
      "csvSeparator": "\u0000",
      "skipRowsFromStart": 0,
      "skipRowsFromEnd": 0
    }
    
  2. Получаем ответ.
    Response type=json
    {
      "type": "Your request file didn't validate with your validation rules",
      "title": "Validation Exception",
      "invalidParams": [
        {
          "rowIndex": 0,
          "ruleName": "isEmmail",
          "field": "A",
          "message": "IllegalArgumentException: RuleName: 'isEmmail' is incorrect"
        }
      ],
      "error": null,
      "messageChain": null
    }
    
Как можем наблюдать, выдается ошибка валидации из-за неправильного названия правила.

Демопримеры

В демопримерах реализованы стандартные сценарии, демонстрирующие работу отдельных сервисов Платформы ГосТех. Отправка тестовых запросов в демопримерах позволит вам ознакомиться с функциями того или иного сервиса. Доступные демопримеры и описания реализованной в них функциональности представлены ниже.
Справочники GET
Получение доступных справочников и данных об их элементах по коду на примере трёх общедоступных классификаторов: ОКЕИ, ОКВЭД, ОКОПФ
Справочники POST
Получение данных из доступных справочников на примере трёх общедоступных классификаторов: ОКЕИ, ОКВЭД, ОКОПФ. Настройка отображаемых столбцов
Предыдущий раздел
Примеры запросов
Следующий раздел
Работа с профилем типа xls
Была ли страница полезной?