apache-kafka - 使用 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 列中的嵌套大括号
解决方案
注意:此答案假定您从 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
推荐阅读
- python - Networkx:计算图表上的最短路径并将其存储到 Pandas 数据框
- angular - Angular 5. 通过参数从 url 导入模块
- selenium - 无法将 Selenium 3.12.0 网格节点连接到网格集线器
- python - TensorFlow 示例——损失增加但它成功收敛
- java - 如何在不导致过度绘制的情况下为 UI 中的特定组件添加背景颜色?
- android - RecyclerView itemView 的 childView getHeight() 始终为 0
- java - Java:如何在 Android Studio 中生成随机信号?
- ios - 2.7 找不到平台 info.plist CFBundleSupportedPlatforms 或 Mach-O LC_VERSION_MIN
- python - 为什么这段代码打印的是 True 而不是 False?(是因为矩阵创建吗?)
- python - 连接两列pyspark数据框时获取唯一值