带有 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)):应为有效值(JSON 字符串、数字、数组、对象或令牌"null"、"true"或"false") 在 [来源: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); 行: 1, 列: 2]卷曲: (6) 无法解析主机:架构 卷曲:(3) [通配] 第 115 列中的嵌套大括号

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

  • 单一的顶级schema属性

  • 其值是恰好也包含 JSON 的单个字符串

如果您从bash(或类似)调用,您需要做的就是将所有""替换为'...'字符串中的",并在最后}之前插入一个"

tl;dr,从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"')

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


步说明

首先,根据 JSON 的要求,使用 PowerShell 中的逐字 here-string 单独创建此 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程序(在 Windows 上curl.exe):

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

我遇到了同样的问题。我的解决方案是只使用带有正确标头的邮递员,并仅使用架构属性发送 json,如下所述: https://docs.confluent.io/platform/current/schema-registry/develop/api.html#schemaregistry-api

你可以像这样使用一个 json:

{ "schema": "{ "type": "record", "name": "test", "fields": [ { "type": "string", "name": "field1" }, { "type": "int", "name": "field2" } ] }" }

该 json 取自文档。

最新更新