我曾经根据 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));
});
});
好吧,经过一番调查,我意识到 ajv 不适用于 openapi 模式格式,并且需要一些努力来从 OpenApi 模式中准备 JSON,这在处理引用和嵌套时可能会很棘手。
就我的例子而言,有两个问题:
$ref: "testObject.json#/schemas/testObject"
-> 不正确。应该是这样的"testObject.json#/definitionId"
const testObject = {
$id: "http://example.com/schemas/testObject.json",
definitions: {
int: {type: "integer"},
str: {type: "string"},
},
}
所以我可以引用确切的对象,如下所示:
$ref: "testObject.json#/definitions/int"