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 在您的环境中安装并运行。

流程

  1. 添加 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
  2. 验证响应是否包含预期的 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"}}
  3. 添加 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 内容类型。
  4. 验证响应是否包含预期的 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"}}
  5. 通过指定包含引用的工件的协调,从 Apicurio Registry 检索工件引用:

    $ curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts/Item/versions/1.0.0/references
  6. 验证响应是否包含此工件引用的预期 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 实现了。其他架构类型不支持该参数。

  1. 检索 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
  2. 验证响应是否包含此工件内容的预期 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 不支持。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部