我正在尝试使用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)。
这可能不是完全令人满意的答案,但有一种方法可以将 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}"
但是,这种解决方案可以工作,可能不太可持续,因为您需要在每次部署后执行修补程序操作
。
以下是工作示例:
{
"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