4.3. 使用 Apicurio Registry REST API 命令管理 schema 和 API 工件引用


一些 Apicurio Registry 工件类型可以包含从一个 工件文件到另一个工件的工件引用。您可以通过定义可重复使用的模式或 API 工件来创建效率,然后从工件引用中的多个位置引用它们。

以下工件类型支持工件引用:

  • Apache Avro
  • Google Protobuf
  • JSON 架构
  • OpenAPI
  • AsyncAPI

本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v2 添加和检索到 Apicurio Registry 中简单 Avro schema 工件的工件引用。

本例首先创建一个名为 ItemId 的模式工件:

ItemId 模式

{
    "namespace":"com.example.common",
    "name":"ItemId",
    "type":"record",
    "fields":[
        {
            "name":"id",
            "type":"int"
        }
    ]
}
Copy to Clipboard Toggle word wrap

然后,本示例创建一个名为 Item 的 schema 工件,其中包含对嵌套 ItemId 工件的引用。

带有嵌套 ItemId 模式的项目模式

{
    "namespace":"com.example.common",
    "name":"Item",
    "type":"record",
    "fields":[
        {
            "name":"itemId",
            "type":"com.example.common.ItemId"
        },
    ]
}
Copy to Clipboard Toggle word wrap

前提条件

  • Apicurio Registry 在您的环境中安装并运行。

流程

  1. 添加 ItemId 模式工件,您要使用 /groups/{group}/artifacts 操作创建嵌套工件引用:

    $ curl -X POST MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts \
       -H "Content-Type: application/json; artifactType=AVRO" \
       -H "X-Registry-ArtifactId: ItemId" \
       -H "Authorization: Bearer $ACCESS_TOKEN" \
       --data '{"namespace": "com.example.common", "type": "record", "name": "ItemId", "fields":[{"name":"id", "type":"int"}]}'
    Copy to Clipboard Toggle word wrap
    • 这个示例添加了一个 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 正文,以确认是否添加了构件。例如:

    {"name":"ItemId","createdBy":"","createdOn":"2022-04-14T10:50:09+0000","modifiedBy":"","modifiedOn":"2022-04-14T10:50:09+0000","id":"ItemId","version":"1","type":"AVRO","globalId":1,"state":"ENABLED","groupId":"my-group","contentId":1,"references":[]}
    Copy to Clipboard Toggle word wrap
  3. 添加 Item 模式工件,它包括使用 /groups/{group}/artifacts 操作的到 ItemId 模式的工作引用:

    $ curl -X POST MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts \
    -H 'Content-Type: application/create.extended+json' \
    -H "X-Registry-ArtifactId: Item" \
    -H 'X-Registry-ArtifactType: AVRO' \
    -H "Authorization: Bearer $ACCESS_TOKEN" \
    --data-raw '{
        "content": "{\r\n \"namespace\":\"com.example.common\",\r\n  \"name\":\"Item\",\r\n  \"type\":\"record\",\r\n  \"fields\":[\r\n   {\r\n  \"name\":\"itemId\",\r\n   \"type\":\"com.example.common.ItemId\"\r\n        }\r\n    ]\r\n}",
        "references": [
            {
                "groupId": "my-group",
                "artifactId": "ItemId",
                "name": "com.example.common.ItemId",
                "version": "1"
            }
        ]
    }'
    Copy to Clipboard Toggle word wrap
    • 对于工件引用,您必须指定 application/create.extended+json 的自定义内容类型,它将扩展 application/json 内容类型。
  4. 验证响应是否包含预期的 JSON 正文,以确认工件是否已创建有引用。例如:

    {"name":"Item","createdBy":"","createdOn":"2022-04-14T11:52:15+0000","modifiedBy":"","modifiedOn":"2022-04-14T11:52:15+0000","id":"Item","version":"1","type":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2, "references":[{"artifactId":"ItemId","groupId":"my-group","name":"ItemId","version":"1"}] }
    Copy to Clipboard Toggle word wrap
  5. 通过指定包含引用的工件的全局 ID,从 Apicurio Registry 检索工件引用。在本例中,指定的全局 ID 是 2

    $ curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v2/ids/globalIds/2/references
    Copy to Clipboard Toggle word wrap
  6. 验证响应是否包含此工件引用的预期 JSON 正文。例如:

    [{"groupId":"my-group","artifactId":"ItemId","version":"1","name":"com.example.common.ItemId"}]
    Copy to Clipboard Toggle word wrap

解引用工件内容

在某些情况下,使用引用内容返回工件内容可能很有用。对于这样的情况,Core Registry API v2 在某些操作中支持 dereference query 参数。

目前,当 API 操作中指定 dereference 参数时,仅支持 Avro、Protobuf、OpenAPI、AsyncAPI 和 JSON Schema 工件。其它工件类型不支持此参数。

注意

对于 Protobuf 工件,只有在所有模式都属于同一软件包时才支持取消引用内容。

注意

环形依赖项被一些工件类型(如 JSON 架构)允许,但 Apicurio Registry 不支持。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat