首页 > 解决方案 > 使用 curl 注册 Kafka Schema

问题描述

用于注册模式的命令:

curl -i -XPOST -u "accesskey:secretkey" -H "Content-Type: application/vnd.schemaregistry.v1+json" https://schema-registry.nonprod.us-west-2.aws.proton.x.com/subjects/tracking-info-publish-avro-value/versions --data '{ "schema": "{""type"":""record"",""name"":""ShipmentNotification"",""namespace"":""com.x.ordertrackinginfo.eventschema"",""fields"":[{""name"":""sellingStoreNumber"",""type"":""int""}}'

错误:

意外字符('''(代码 39)):在 [Source: (org.glassfish.jersey. message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); 行:1,列:2]curl:(6)无法解析主机:模式 curl:(3)[globbing] 115 列中的嵌套大括号

标签: apache-kafkaconfluent-schema-registry

解决方案


注意:此答案假定您从 PowerShell调用并且您正在尝试嵌套JSON,并且您的 JSON 的组成如下:

  • 单一的顶级schema属性

  • 它的值是一个恰好也包含 JSON的字符串。

如果您从bash(或类似)调用,您需要做的就是将所有替换""为字符串\"内部并在 final 之前'...'插入 a 。"}

tl;博士,从 PowerShell 7.1 开始:

curl -i -XPOST -u "accesskey:secretkey" `
     -H "Content-Type: application/vnd.schemaregistry.v1+json" `
     https://schema-registry.nonprod.us-west-2.aws.proton.x.com/subjects/tracking-info-publish-avro-value/versions `
     --data (@'
      { "schema": "{\"type\":\"record\",\"name\":\"ShipmentNotification\",\"namespace\":\"com.x.ordertrackinginfo.eventschema\",\"fields\":[{\"name\":\"sellingStoreNumber\",\"type\":\"int\"}" }
'@ -replace '([\\]*)"', '$1$1\"')

请注意`在行的最后使用 ,以便在下一行继续执行命令(纯粹是为了便于阅读),并且结束'@分隔符必须是该行的第一个字符


分步说明

首先,在 PowerShell 中使用逐字逐句 字符串单独创建此 JSON 字符串(尽管常规逐字字符串 ,'...'可以),将"作为属性一部分的字符(与具有语法功能的字符相反)转义为\",根据 JSON 的要求:

$json = @'
{ 
  "schema": "{\"type\":\"record\",\"name\":\"ShipmentNotification\",\"namespace\":\"com.x.ordertrackinginfo.eventschema\",\"fields\":[{\"name\":\"sellingStoreNumber\",\"type\":\"int\"}"
}
'@

结果字符串是有效的 JSON,您可以使用$json | ConvertFrom-Json

接下来,必须应用额外的转义才能将字符串传递给外部程序

  • 笔记:
    • 这轮额外的转义本来是不必要的,但至少要到 PowerShell 版本 7.1(撰写本文时的当前版本)。
    • 可以配置 v7.2 预览版中的实验性功能来解决此问题,因此不再需要此步骤。
    • 有关背景信息和详细信息,请参阅此答案
$jsonEscapedForExternalProgram = $json -replace '([\\]*)"', '$1$1\"'

现在您可以将转义的 JSON 字符串传递给外部curl程序(curl.exe在 Windows 上):

curl -i -XPOST -u "accesskey:secretkey" `
     -H "Content-Type: application/vnd.schemaregistry.v1+json" `
     https://schema-registry.nonprod.us-west-2.aws.proton.x.com/subjects/tracking-info-publish-avro-value/versions `
     --data $jsonEscapedForExternalProgram

推荐阅读