如何防止 cURL 通过 & 符号连接多个 `--data` 值?

如何防止 cURL 通过 & 符号连接多个 `--data` 值?

我正在使用 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"
    

相关内容