4.3. 使用 Apicurio Registry REST API 命令管理 schema 和 API 工件引用
一些 Apicurio Registry 工件类型可以包含从一个 工件文件到另一个工件的工件引用。您可以通过定义可重复使用的模式或 API 工件来创建效率,然后从工件引用中的多个位置引用它们。
以下工件类型支持工件引用:
- Apache Avro
- Google Protobuf
- JSON 架构
- OpenAPI
- AsyncAPI
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v3 添加和检索到 Apicurio Registry 中简单 Avro schema 工件的工件引用。
本例首先创建一个名为 ItemId 的模式工件:
ItemId 模式
{
"namespace":"com.example.common",
"name":"ItemId",
"type":"record",
"fields":[
{
"name":"id",
"type":"int"
}
]
}
然后,本示例创建一个名为 Item 的 schema 工件,其中包含对嵌套 ItemId 工件的引用。
带有嵌套 ItemId 模式的项目模式
{
"namespace":"com.example.common",
"name":"Item",
"type":"record",
"fields":[
{
"name":"itemId",
"type":"com.example.common.ItemId"
}
]
}
前提条件
- Apicurio Registry 在您的环境中安装并运行。
流程
添加
ItemId模式工件,您要使用/groups/{groupId}/artifacts操作创建嵌套工件引用:$ curl -X POST MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data '{"artifactId":"ItemId","artifactType":"AVRO","firstVersion":{"version":"1.0.0","content":{"content":"{\"namespace\":\"com.example.common\",\"name\":\"ItemId\",\"type\":\"record\",\"fields\":[{\"name\":\"id\",\"type\":\"int\"}]}","contentType":"application/json"}}}'-
这个示例添加了一个 Avro schema 工件,工件 ID 为
ItemId。如果没有指定唯一的工件 ID,Apicurio Registry 会自动生成一个作为 UUID。 -
MY-REGISTRY-URL是在其上部署 Apicurio Registry 的主机名。例如:my-cluster-service-registry-myproject.example.com。 -
本例在 API 路径中指定
my-group的组 ID。如果没有指定唯一的组 ID,则必须在 API 路径中指定../groups/default。
-
这个示例添加了一个 Avro schema 工件,工件 ID 为
验证响应是否包含预期的 JSON 正文,以确认是否添加了构件。例如:
{"artifact":{"owner":"","createdOn":"2024-09-26T16:27:38Z","modifiedBy":"","modifiedOn":"2024-09-26T16:27:38Z","artifactType":"AVRO","groupId":"my-group","artifactId":"ItemId"},"version":{"version":"1.0.0","owner":"","createdOn":"2024-09-26T16:27:38Z","artifactType":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2,"artifactId":"ItemId"}}添加
Item模式工件,它使用/groups/{groupId}/artifacts操作包含到ItemId模式的工件引用:$ curl -X POST MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data-raw '{ "artifactId": "Item", "artifactType": "AVRO", "firstVersion": { "version": "1.0.0", "content": { "content": "{\"namespace\":\"com.example.common\",\"name\":\"Item\",\"type\":\"record\",\"fields\":[{\"name\":\"itemId\",\"type\":\"com.example.common.ItemId\"}]}", "contentType": "application/json", "references": [ { "name": "com.example.common.ItemId", "groupId": "my-group", "artifactId": "ItemId", "version": "1.0.0" } ] } } }'-
对于工件引用,您必须指定
application/create.extended+json的自定义内容类型,它将扩展application/json内容类型。
-
对于工件引用,您必须指定
验证响应是否包含预期的 JSON 正文,以确认工件是否已创建有引用。例如:
{"artifact":{"owner":"","createdOn":"2024-09-26T16:28:45Z","modifiedBy":"","modifiedOn":"2024-09-26T16:28:45Z","artifactType":"AVRO","groupId":"my-group","artifactId":"Item"},"version":{"version":"1.0.0","owner":"","createdOn":"2024-09-26T16:28:45Z","artifactType":"AVRO","globalId":3,"state":"ENABLED","groupId":"my-group","contentId":3,"artifactId":"Item"}}通过指定包含引用的工件的协调,从 Apicurio Registry 检索工件引用:
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts/Item/versions/1.0.0/references验证响应是否包含此工件引用的预期 JSON 正文。例如:
[{"groupId":"my-group","artifactId":"ItemId","version":"1.0.0","name":"com.example.common.ItemId"}]
解引用
在某些情况下,带有引用的内容内联内容可能会很有用。对于这样的情况,Core Registry API v3 在 某些操作中支持 reference 参数。
目前,当特定 API 操作中存在参数时,这个支持目前为 Avro, JSON Schema, Protobuf, OpenAPI 和 AsyncAPI 实现了。其他架构类型不支持该参数。
检索 dereferenced (lined) schema 内容:
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts/Item/versions/1.0.0/content?references=DEREFERENCE验证响应是否包含此工件内容的预期 JSON 正文,其中包含内联引用。例如:
{"type":"record","name":"Item","namespace":"com.example.common","fields":[{"name":"itemId","type":{"type":"record","name":"ItemId","fields":[{"name":"id","type":"int"}]}}]}
目前,当 API 操作中指定 dereference 参数时,仅支持 Avro、Protobuf、OpenAPI、AsyncAPI 和 JSON Schema 工件。其它工件类型不支持此参数。
对于 Protobuf 工件,只有在所有模式都属于同一软件包时才支持取消引用内容。
环形依赖项被一些工件类型(如 JSON 架构)允许,但 Apicurio Registry 不支持。