Проверка нескольких вхождений параметров запроса с помощью json-схемы и AJV

Я хочу проверить несколько экземпляров одного и того же параметра запроса с помощью AJV.

Моя схема OpenApi выглядит примерно так:

...
/contacts:
  get:
    parameters:
      - name: user_id
        in: query
        schema:
          type: integer
...

Я конвертирую его в действительную схему json, чтобы иметь возможность проверить ее с помощью AJV:

{
  query: {
    properties: {
      user_id: { type: 'integer' }
    }
  }
}

Естественно, проверка AJV отлично работает для одного параметра целочисленного типа.

Я хочу иметь возможность проверять несколько случаев появления user_id. Например: /contacts?user_id=1&user_id=2 преобразуется в { user_id: [1, 2] }, и я хочу, чтобы он действительно был действительным.

На этом этапе проверка не выполняется, потому что ожидает целое число, но получает массив. Есть ли способ проверить каждый элемент массива независимо?

Спасибо


person Aurelien    schedule 04.11.2018    source источник


Ответы (1)


Возможно, в схеме для user_id следует использовать составные ключевые слова anyOf, позволяющие определять несколько схем для единственное свойство:

var ajv = new Ajv({
  allErrors: true
});

var schema = {
  "properties": {
    "user_id": {
      "anyOf": [{
          "type": "integer"
        },
        {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
      ]
    },
  }
};

var validate = ajv.compile(schema);

function test(data) {
  var valid = validate(data);
  if (valid) console.log('Valid!');
  else console.log('Invalid: ' + ajv.errorsText(validate.errors));
}

test({
  "user_id": 1
});
test({
  "user_id": "foo"
});
test({
  "user_id": [1, 2]
});
test({
  "user_id": [1, "foo"]
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/6.5.5/ajv.min.js"></script>

person customcommander    schedule 12.11.2018