使用 ajv 进行 OpenApi 架构验证

问题描述 投票:0回答:1

我曾经根据 OpenAPI 架构的一部分来验证响应正文(我解析了架构文件并仅采用了所需的响应架构)。

但是当响应模式引用另一个 Components.schema (来自同一文件)时 - 它不会工作。我读过这篇关于组合模式的文档:https://ajv.js.org/guide/combining-schemas.html

但尚不清楚如何使用多个引用/模式。

“ajv”库似乎无法与整个 OpenAPI 模式对象一起使用(错误:严格模式:未知关键字:“openapi”)。

整个 OpenAPI 模式验证是否可行?如何组合 2 个以上的模式(如果有很多参考文献)?

目前我正在尝试组合至少 2 个模式,但遇到了解析引用错误:

无法从 id 解析引用 testObject.json#/schemas/testObject http://example.com/schemas/searchResults.json

这是我的测试文件(它是 OpenAPI 的一部分,仅用于测试这个特定的参考案例):

## test.spec.yaml    
    schemas:
        testObject:
          $id: http://example.com/schemas/testObject.json
          type: object
          properties:
            prop1:
              type: string
        searchResults:
          $id: http://example.com/schemas/searchResults.json
          type: object
          properties:
            testObjects:
              type: array
              items:
                $ref: "testObject.json#/schemas/testObject"

这是我的代码:

import * as fs from "fs";

import Ajv from "ajv";
import * as yaml from "js-yaml";

describe("test", () => {
  it("should validate the openapi schema", async () => {
    const schema: any = yaml.load(fs.readFileSync("test.spec.yaml", "utf8"));

    const a = schema.schemas.searchResults;
    const b = schema.schemas.testObject;

    const ajv = new Ajv({
      strict: true,
      allErrors: true,
      verbose: false,
      schemas: [a, b],
    });

    const validate: any = ajv.getSchema(
      "http://example.com/schemas/searchResults.json"
    );
    const valid = validate({ testObjects: "foo" });
    if (!valid) throw new Error(JSON.stringify(validate.errors));
  });
});
node.js openapi ajv
1个回答
0
投票

好吧,经过一番调查,我意识到 ajv 不适用于 openapi 模式格式,并且需要一些努力来从 OpenApi 模式中准备 JSON,这在处理引用和嵌套时可能会很棘手。

就我的例子而言,有两个问题:

  1. $ref: "testObject.json#/schemas/testObject"
    -> 不正确。应该是这样的
    "testObject.json#/definitionId"
  2. 定义的结构应该不同,如文档中的示例:
    const testObject = {
        $id: "http://example.com/schemas/testObject.json",
        definitions: {
            int: {type: "integer"},
            str: {type: "string"},
        },
    }

所以我可以引用确切的对象,如下所示:

$ref: "testObject.json#/definitions/int"

© www.soinside.com 2019 - 2024. All rights reserved.