引用API网关中的外部模型而不使用API ID



我正在使用JSON Schema编写一个API网关模型,并使用无服务器框架进行部署。根据本页,可以使用引用在不同文件(但在同一API中)中定义的模型

"$ref": "https://apigateway.amazonaws.com/restapis/{restapi_id}/models/{model_name}"

问题是,这需要知道API ID。在我的情况下,模型将在多个API中重复使用,每个API都有自己的ID,因此在模型中硬编码ID是没有意义的。

是否有任何方法可以在不使用API ID的情况下引用外部模型,或者在部署期间将API ID注入到模型中?

您可以导出模型并将其保存在配置文件中以供以后使用。这不一定是您想要的,但它可以让您对标准模型进行版本控制,并允许您在服务中使用它们。

例如,使用无服务器aws文档:

在无服务器.yml 中

custom:
documentation:
models: ${file(./conf/api/methodResponse/models.yml):models}
plugins:
- serverless-aws-documentation

在参考模型中。yml:

models:
-
name: EmptyModel
contentType: "application/json"
schema:
"$schema": "http://json-schema.org/draft-04/schema#"
title: "Empty/Passthrough Response"
type: object

请注意,"$schema"字段似乎是可选的,我相信,至少我的测试是在没有它的情况下部署和运行的。我只是保留了它,因为AWS的模板使用了它。

这将使您能够对模型进行局部控制。这将意味着您需要做一些额外的工作来跨堆栈同步模型。

现在,如果您想通过引用在另一个服务中使用现有模型,而通过重新部署而不是,我不完全确定这是否可行。CloudFormation模型对象似乎只能通过其模型名称来识别,该名称一次可以与单个ApiGatewayRestApi对象关联。当我尝试在堆栈之间部署相同的模型名称时,它很乐意接受,并且旧模型保持不变。也许有一种方式我错过了,不过?

更新:我最初发布的解决方案在某些情况下有效,但在其他情况下无效。我现在发布了一个通常有效的解决方案(而且要简单得多)

我刚刚遇到了同样的问题,如何保持那些模型引用中的API ID不是硬编码的。这个问题已经有些过时了,但由于我花了几个小时才找到答案,我将把它张贴在这里,留给后人。

假设您有一个名为CreateUserRequest的请求模型,并且您想考虑User模式,然后将以下内容放入您的serverless.yaml:

...
custom:
documentation: 
models:
-
name: "User"
contentType: "application/json"
schema: ${file(models/user.json)}
-
name: "CreateUserRequest"
description: "User to be created"
contentType: "application/json"
schema:
$ref: "{{model: User}}"

JSON模式进入models子文件夹中的user.JSON文件。如果您想引用user.JSON文件中的其他JSON模式,在无服务器aws文档中有一种特殊的方法:

{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"description": "A system user",
"properties": {
"id": {
"type": "string",
"title": "ID of the object"
},
"identity": {
"$ref": "{{model: UserIdentity}}"
},
"profile": {
"$ref": "{{model: UserProfile}}"
}
}
}

在serverless.yaml文件中,您还需要将那些被引用的模式文件称为模型。

custom:
documentation: 
models:
...
-
name: "UserIdentity"
contentType: "application/json"
schema: ${file(api-models/user-identity.json)}
-
name: "UserProfile"
contentType: "application/json"
schema: ${file(api-models/user-profile.json)}

请注意,这些JSON模式文件中的引用不是有效的JSON模式引用,因此例如,您不能使用JSON模式验证器加载它们(至少不能直接加载)。这正是无服务器aws文档所期望的。如果它能够支持真正的JSON模式引用会更好,但我也没有时间贡献这样的增强。

最新更新