swagger FastAPI自动生成的OpenAPI文件根据Insomnia无效

x7yiwoj4  于 2023-03-29  发布在  其他
关注(0)|答案(1)|浏览(208)

我试图将openapi.json导入Insomnia以生成集合,但Insomnia说它无效。

FastAPI/Swagger和Insomnia的规则集是否有差异?如果没有,是什么原因导致兼容性差异?

下面是一个自动生成的OpenAPI规范的精简示例:

{
    "openapi": "3.0.2",
    "info": {
        "title": "Test API",
        "description": "description",
        "contact": {
            "name": "example",
            "url": "https://example.com/contact-us/",
            "email": "example@example.com"
        },
        "license": {
            "name": "Copyright 2023 example"
        },
        "version": "0.0.1"
    },
    "paths": {
        "/test_build": {
            "get": {
                "tags": [
                    "Test endpoints"
                ],
                "summary": "Test",
                "description": "",
                "operationId": "test_build_get",
                "responses": {
                    "200": {
                        "description": "Successful Response",
                        "content": {
                            "application/json": {
                                "schema": {}
                            }
                        }
                    }
                }
            }
        },
        "/api/search_something": {
            "get": {
                "tags": [
                    "Main endpoints"
                ],
                "summary": "Search something",
                "description": "",
                "operationId": "search_something_get",
                "parameters": [
                    {
                        "required": false,
                        "schema": {
                            "title": "something",
                            "maximum": 50.0,
                            "exclusiveMinimum": 0.0,
                            "type": "integer",
                            "default": 50
                        },
                        "name": "something",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successful Response",
                        "content": {}
                    }
                }
            }
        }
    }
}

Insomnia出于多种原因拒绝了这一点,但这里有一些错误和警告的例子:

  • oas 3-api-servers OpenAPI“服务器”必须存在且为非空数组。
  • operation-tag-defined操作标记必须在全局标记中定义。
  • oas 3-schema“exclusiveMinimum”属性类型必须为布尔值。
  • oas 3-valid-schema-示例架构无效:存在exclusiveMinimum属性时,数据必须具有minimum属性
    有没有办法让FastAPI的openapi.json文件符合Insomnia的规则集?
q8l4jmvw

q8l4jmvw1#

oas 3-schema“exclusiveMinimum”属性类型必须为布尔值。
exclusiveMinimumexclusiveMaximum被生成为数字而不是布尔值是Pydantic的known issue。Pydantic根据JSON Schema Draft 6+将这些关键字生成为数字,但OpenAPI 3.0.x使用早期的JSON Schema Draft 5,其中exclusive*关键字是布尔值。
如果/当FastAPI和Pydantic迁移到OpenAPI 3.1时,这不会是一个问题,因为它使用最新的JSON Schema。
但如果需要使用OpenAPI 3.0.x,您有以下选项。

选项1:使用ge/le而不是gt/lt(如果适用)

对于integer参数和schema字段,最简单的修复方法是使用ge/le属性(“大于/小于 * 或等于 *”)而不是gt/lt(“大于/小于”)。例如,如果最大值为50(包括50),则使用le=50而不是lt=51

something: int = Query(le=50)

Pydantic将le转换为maximum,将ge转换为minimum,而不使用exclusive*

选项2:后处理OpenAPI文件

另一种解决方案是对生成的OpenAPI文件(例如as suggested here)进行后处理,并替换

"exclusiveMinimum": <value>

"minimum": <value>,
"exclusiveMinimum": true

同样,替换

"exclusiveMaximum": <value>

"maximum": <value>,
"exclusiveMaximum": true

相关问题