能否将一个curl的JSON输出流式传入另一个curl的data参数?
需求可行,但你的命令存在格式问题
首先明确:将第一个curl的JSON输出流式传入第二个curl的data参数是完全可行的,你遇到400错误是因为中间jq处理后的输出格式不符合后端要求。
问题根源分析
你用jq '.[] | select(.query|test("latency")) | @json'处理后,输出的是一个被双引号包裹的JSON字符串(比如你看到的"{\"query\":\"origin...\"}"),而第二个curl需要提交的是原始JSON对象,不是字符串形式的JSON。当你手动传入时,其实是把这个字符串里的转义引号还原后直接作为JSON对象提交;但管道传递时,整个带外层引号的字符串被后端当成了无效的JSON结构,导致解析失败(也就是HttpMessageNotReadableException的触发原因)。
修复后的命令
把jq命令里的@json去掉,直接输出筛选后的JSON对象即可:
curl -sG api.com/test -H "Authorization: Bearer ${token}" | jq '.[] | select(.query|test("latency"))' | curl -d @- -H "Authorization: Bearer ${token}" -H "Content-Type: application/json" "api.com/test"
额外优化说明
如果需要修改输出JSON里的字段(比如你手动调整的threshold值),可以直接在jq里完成处理,一步实现筛选、修改和传递:
curl -sG api.com/test -H "Authorization: Bearer ${token}" | jq '.[] | select(.query|test("latency")) | .threshold.critical=20000 | .threshold.warning=15000' | curl -d @- -H "Authorization: Bearer ${token}" -H "Content-Type: application/json" "api.com/test"
内容的提问来源于stack exchange,提问作者Radford
相关产品推荐
相关产品推荐

