Проверка нескольких вхождений параметров запроса с использованием JSON-схемы и AJV - PullRequest
0 голосов
/ 04 ноября 2018

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

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

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

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

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

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

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

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

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

Возможно, для схемы 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>
...