我想通过curl发送带有长字符串字段的大json,如何将其裁剪为多行?例如:
curl -X POST 'localhost:3000/upload' \
-H 'Content-Type: application/json'
-d "{
\"markdown\": \"# $TITLE\\n\\nsome content with multiple lines....\\n\\nsome content with multiple lines....\\n\\nsome content with multiple lines....\\n\\nsome content with multiple lines....\\n\\n\"
}"
答案 0 :(得分:2)
使用jq
之类的工具来生成JSON,而不是尝试手动构造它。在shell中构建多行字符串,并让jq
对其进行编码。最重要的是,这避免了TITLE
包含可能在形成JSON值时需要正确转义的字符而引起的任何潜在错误。
my_str="# $TITLE
some content with multiple lines...
some content with multiple lines...
some content with multiple lines..."
my_json=$(jq --argjson v "$my_str" '{markdown: $v}')
curl -X POST 'localhost:3000/upload' \
-H 'Content-Type: application/json' \
-d "$my_json"
curl
可以从标准输入中读取-d
的数据,这意味着您可以将jq
的输出直接传送到curl
:
jq --argjson v "$my_str" '{markdown: $v}' | curl ... -d@-
答案 1 :(得分:2)
通过使用\
终止行,您可以使用帖子中已有的技术将任何内容拆分为多行。
如果您需要在带引号的字符串中间进行拆分,
终止报价并开始新的报价。
例如,这些是等效的:
echo "foobar"
echo "foo""bar"
echo "foo"\
"bar"
但是对于您的特定示例,我建议一种更好的方法。
在双引号字符串中创建JSON容易出错,
由于必须转义所有内部双引号,
这也变得难以阅读和维护。
更好的选择是使用此处文档,
将其通过管道传递到curl
,然后使用-d@-
使其从stdin读取JSON。
像这样:
formatJson() {
cat << EOF
{
"markdown": "some content with $variable in it"
}
EOF
}
formatJson | curl -X POST 'localhost:3000/upload' \
-H 'Content-Type: application/json'
-d@-
答案 2 :(得分:1)
如果我是您,则将JSON保存到文件中:
curl -X POST 'localhost:3000/upload' \
-H 'Content-Type: application/json' \
-d "$(cat my_json.json)"