如何通过API向TiddlyWiki推送含空格的text字段数据?
向TiddlyWiki API推送含空格的text字段时curl报错的解决方法
问题场景
尝试通过API向TiddlyWiki推送数据创建新tiddler,多数字段可正常传递,但当text字段值包含空格时,curl命令会因误识别为多个URL而报错。当前使用的命令如下:
curl -X PUT -i "http://192.168.1.166:8080/recipes/default/tiddlers/$title" -H "X-Requested-With: TiddlyWiki" --data $(jq -nc --arg tags "$tag" --arg text "'${content}'" '{ $tags, $text }')
已尝试的方法均未解决问题:
- 手动嵌套多层引号、用变量包裹内容
- 用sed将空格替换为%20(会被当作字面量,无实际作用)
- 使用
--data-urlencode "text=${var}",仅title变量正常展开,其他字段未填充
使用环境:zsh shell
解决方案
问题核心是shell参数展开时未正确包裹JSON字符串,导致空格被分割成多个参数。修改后的命令如下:
curl -X PUT -i "http://192.168.1.166:8080/recipes/default/tiddlers/$title" \ -H "X-Requested-With: TiddlyWiki" \ --data "$(jq -nc --arg tags "$tag" --arg text "$content" '{ $tags, $text }')"
关键修改点
- 给jq输出加双引号:
"$(jq ...)"确保zsh将整个JSON输出当作单个完整参数传递给curl,避免空格分割参数。 - 移除text参数的额外单引号:jq的
--arg会自动将变量内容处理为合法JSON字符串,手动添加的'${content}'会导致JSON格式错误,直接用--arg text "$content"即可。
额外优化(可选)
如果$title包含特殊字符(如空格、&等),需要对其进行URL编码,避免请求路径错误。zsh中可通过print -r -- ${(urlencode)title}实现:
encoded_title=$(print -r -- ${(urlencode)title}) curl -X PUT -i "http://192.168.1.166:8080/recipes/default/tiddlers/$encoded_title" \ -H "X-Requested-With: TiddlyWiki" \ --data "$(jq -nc --arg tags "$tag" --arg text "$content" '{ $tags, $text }')"
内容的提问来源于stack exchange,提问作者nerd_noob
相关产品推荐
相关产品推荐

