Pulsar中curl上传特定Avro Schema卡住但Postman上传正常
故障根因
问题出在Bash变量引用的语法细节上:你在uploading_topic函数中使用--data-raw $SCHEMA传参时,没有给$SCHEMA加双引号。
Bash解析未加双引号的变量时,会按照内置IFS分隔符(默认是空格、制表符、换行)对变量内容做单词拆分:拆分后的第一部分会被识别为--data-raw的参数值,剩下的所有片段都会被curl当作待请求的目标URL处理。
短Schema(单层、双层嵌套的两个示例)定义时是单行无空白字符的格式,不会触发拆分逻辑,所以能正常上传。长嵌套Schema大概率在编写时为了可读性加入了换行、空格格式化(哪怕是混入的不可见空白字符),触发了拆分:curl拿到的请求体残缺,同时会尝试连接拆分出来的无效“URL”,在等待DNS解析、连接超时的过程中就会表现为请求永久挂起无返回。Postman直接传递完整请求体,不存在shell参数拆分问题,所以请求正常。
修复方法
核心修复
给$SCHEMA变量包裹双引号,强制shell将其作为单个完整参数传递给curl,修改后对应参数行如下:
--data-raw "$SCHEMA"
可选优化
- 超长Schema场景建议用文件传参,彻底规避命令行参数转义、拆分风险:
# 先将完整Schema写入临时文件 echo "$SCHEMA" > /tmp/current_schema.json curl --location --request POST "https://$PULSAR_HOST:$HOST_PULSAR_PORT/admin/v2/schemas/$TENANT/$NAMESPACE/$TOPIC/schema" \ --max-time 30 \ --fail \ --verbose \ --header "Authorization: Bearer $AUTHORIZATION" \ --insecure \ --header 'Content-Type: application/json' \ --data @/tmp/current_schema.json 2>&1 | grep "HTTP" # 清理临时文件 rm -f /tmp/current_schema.json
- 给curl增加
--max-time 30参数设置全局请求超时,增加--fail参数让HTTP错误码直接返回非0退出值,避免脚本异常挂起。
额外提示:你当前用单引号定义Schema变量,内部的
$TENANT/$NAMESPACE/$TOPIC不会被Bash解析替换,最终上传的Schema namespace会保留$符号的字面量。如果需要动态替换这几个值,要把最外层的单引号改成双引号,同时对内部的JSON双引号做转义处理。
内容的提问来源于stack exchange,提问作者Hofbr
相关产品推荐
相关产品推荐

