我正在使用 cURL 将一些数据放入 Redmine 服务器上。我想使用多个--data-xxx
选项来构建有效的 XML 请求主体。命令如下:
curl -H "Content-Type: application/xml" \
-H "X-Redmine-API-Key: $TOKEN" \
-d "<?xml version=\"1.0\"?><wiki_page><text>" \
--data-binary "@$FILE" \
-d "</text></wiki_page>" \
-X PUT http://some.redmine.site.com/projects/someproj/wiki/test.xml
但是,正如--data
选项所记录的:
如果在同一命令行上多次使用这些选项,则指定的数据片段将以分隔符 & 合并在一起。因此,使用
-d name=daniel -d skill=lousy
将生成如下所示的帖子块name=daniel&skill=lousy
。
我可以理解 cURL 的设计者这样做是为了帮助构建带有查询字符串的 URL。但在这种情况下,这些添加的 & 符号会使我的请求 XML 正文格式错误。当它在 之后时,我可以在值前面添加“nbsp;”来解决这个问题--data
。但当涉及到与文件 ( --data-binary "@$FILE"
) 混合使用时,就没有办法解决这个问题了。
答案1
那么,只需将所有内容作为单个--data
值传递即可。有几种方法可以做到这一点:
对于短文件,在命令中“包含”文件的原始内容:
curl … -d "<?xml…?><wiki_page><text>$(cat "$FILE")</text></wiki_page>"
对于较长的文件,请创建一个包含所需数据的临时文件:
temp=$(mktemp /tmp/redmineXXXXXXXX.xml) { echo "<?xml…>" echo "<wiki_page><text>" cat "$FILE" echo "</text></wiki_page>" } > "$temp" curl … -d "@$temp" rm -f "$temp"