当前位置: 首页 > 知识库问答 >
问题:

AWS API网关的OpenAPI / Swagger模型继承

成浩漫
2023-03-14

我正在尝试使用AWS API网关实现Swagger或OpenAPI 3.0中定义的API。

这个API中的一个endpoint采用一个抽象的基本模型(让我们称之为< code>Pet以与老套的Swagger示例保持一致),但实际上期望一个从< code>Pet派生的具体模型...例如< code>Dog。

具体模型可以通过Pet上的类型(type)属性确定。

当然,这是一个歧视者的工作:

definitions:
    Pet:
        discriminator: petType
        required:
        - name
        - petType # required for inheritance to work
        properties:
        name: 
            type: string
        petType:
            type: string
    Cat:
        allOf:
        - $ref: '#/definitions/Pet' # Cat has all properties of a Pet
        - properties: # extra properties only for cats
            huntingSkill:
                type: string
                default: lazy
                enum:
                - lazy
                - aggressive
    Dog:
        allOf:
        - $ref: '#/definitions/Pet' # Dog has all properties of a Pet
        - properties: # extra properties only for dogs
            packSize:
                description: The size of the pack the dog is from
                type: integer

(取自此处)

好吧,很烦人,但也许一个解决方法是用OpenAPI 3.0定义API,并在模式中使用< code>oneOf:

paths:
    /pets:
        patch:
            requestBody:
                content:
                    application/json:
                        schema:
                            oneOf:
                                - $ref: '#/components/schemas/Cat'
                                - $ref: '#/components/schemas/Dog'

然而(再次),AWS API网关也不支持< code > one of (ref)。

共有2个答案

漆雕皓轩
2023-03-14

这可能不是完全令人满意的答案,但有一种方法可以将 oneOf 与 API 网关配合使用。您可以根据 AWS 对各个模型使用 JSON 架构。

由于这一事实,您可以在部署API网关后更新模型。

# Reformatted here for readability
VALUE='"{\"$schema\": \"http://json-schema.org/draft-04/schema#\",
         \"title\": \"A Pet Request\",
         \"oneOf\":
        [{ \"$ref\": \"https://apigateway.amazonaws.com/restapis/xxxxxxx/models/Cat\" },
         { \"$ref\": \"https://apigateway.amazonaws.com/restapis/xxxxxxx/models/Dog\" }]}"'


aws apigateway update-model \
--rest-api-id xxxxxxx \
--model-name 'PetRequest' \
--patch-operations "op=replace,path=/schema,value=${VALUE}"

但是,这种解决方案可以工作,可能不太可持续,因为您需要在每次部署后执行修补程序操作

袁泓
2023-03-14

以下是工作示例:

{
  "openapi": "3.0.1",
  "info": {
    // (...)
  },
  "paths": {
    "/pets": {
      "post": {
        "summary": "Post a pet",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PetRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            // (...)
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Cat": {
        "type": "object",
        "required": [
          "cat_stuff"
        ],
        "properties": {
          "cat_stuff": {
            "type": "string"
          }
        }
      },
      "Dog": {
        "type": "object",
        "required": [
          "dog_stuff"
        ],
        "properties": {
          "dog_stuff": {
            "type": "string"
          },
        }
      },
      "PetRequest": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/Cat"
          },
          {
            "$ref": "#/components/schemas/Dog"
          }
        ]
      }
    },
    // Many fields omitted (...)
}

使用与其中一个模式不匹配的有效负载会产生以下错误,这证明< code>oneOf正在按预期工作!

(...)
"error_messages": [
    "[instance failed to match exactly one schema (matched 0 out of 2)]"
],
 类似资料:
  • 我们正在尝试从C#Windows服务调用AWS API网关来执行后台作业。哪个应该触发API网关定期初始化请求? 我们使用RestSharp调用APIendpoint,该类称为AwsAuthenticator,它继承自RestSharp.Authenticators.IAAuthenticator。但当我们调用API Gateway时,收到的错误是“我们计算的请求签名与您提供的签名不匹配。请检查您

  • 我试图使用第三方公司提供的Swagger模式生成Java模型,但生成失败或没有生成我期望的对象。我不确定是生成器还是模式出了问题。 本质上,模式有一个带有属性“attributes”的父对象Pet,其中“attributes”有一个属性“size”。该模式还有一个子对象Cat,它“继承”自Pet(在“all of”语句中引用Pet),并且它本身有一个属性“attributes”和嵌套属性“Whis

  • 我试图在我的java REST-API中映射openAPI模型(使用Swagger代码生成)和JPA实体(从HiberNate中的数据库模式生成),以便我可以使用JPA(Hibernate)实体将接收到的模型保存到数据库中,并使用模型创建从数据库中获取数据的响应。 我知道我可以分别创建使用模型和实体,并创建一种从一个转换到另一个的机制。然而,如果模型中的数据库或字段有任何变化,我需要更新模型和实体

  • 我有一个API,它总是使用关联数组回答,其中只有一个条目包含包含最终结果的键“数据”。结果可以是一个对象或对象数组。这是API输出: 我怎样才能让swagger在文档中显示数据,即键的名称? 至于现在,我只得到大摇大摆的嵌套数组: 我需要数据键在从API返回时以swagger的形式显示。这可行吗?我还没有找到任何解决办法…:/ 我的yaml文件的部分内容: 任何帮助都将不胜感激:) 干杯

  • 使用OpenApi比Swagger的实际优势是什么? 我是openApi技术的新手,只是想知道openApi中有什么比Swagger更多的特性。网上的文件对我没有帮助。有人能帮帮我吗。

  • 有没有人对Swagger Codegen有一些经验?目前,我正在努力执行Swagger Codegen CLI。在本教程之后,我首先尝试通过OpenAPI生成器生成Dart代码:https://clearpoint.digital/blog/accelerate-flutter-development-with-contract-first-openapi-and-dart-code-genera