我有多个查询参数,想在使用curl进行HTTP PUT操作时发送它们。 我该如何对查询参数进行编码? 示例:
$ curl -X PUT http://example.com/resource/1?param1=value%201¶m2=value2
如果'value 1'包含空格或其他由Shell解释的字符,则命令将无法正确解析。
我有多个查询参数,想在使用curl进行HTTP PUT操作时发送它们。 我该如何对查询参数进行编码? 示例:
$ curl -X PUT http://example.com/resource/1?param1=value%201¶m2=value2
如果'value 1'包含空格或其他由Shell解释的字符,则命令将无法正确解析。
解决方案是结合 --data-urlencode
开关和 -G
开关使用。使用原始示例,命令应如下所示:
$ curl -X PUT -G 'http://example.com/resource/1' --data-urlencode 'param1=value 1' --data-urlencode param2=value2
-G
开关会导致使用 --data-urlencode
开关编码的参数以 ?
分隔符附加到 http URL 的末尾。param1
的值将被编码为 value%201
,其中 %20 是空格字符的编码值。我想使用URL编码的查询参数和数据主体/负载(在我的情况下是JSON)。似乎唯一的方法是提供一个包括编码查询字符串的URL来让curl执行此操作,也就是要自己对查询参数进行URL编码。
Sergey和Bruno在这里提供了一个很好的答案: https://dev59.com/43VC5IYBdhLWcg3wbghT#10797966
将它们组合成可用的内容,我得到了以下脚本。
#!/bin/bash
#
urlEncode() {
echo $1 | curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" | sed -E 's/..(.*).../\1/'
}
echo '{"data":"this is some test data"}' > /tmp/test
url="https://example.com/test?$(urlEncode "param1")=$(urlEncode "value 1")&$(urlEncode "param2")=$(urlEncode "value 2")"
# Payload from a file:
curl -X POST $url -H 'Content-Type: application/json' -T "/tmp/test"
# Alternative:
#curl -X POST $url -H 'Content-Type: application/json' --data '{"data":"this is some test data"}'
PUT请求实际上像POST请求一样工作。
您应该使用$ curl -X PUT --data "param1=value1¶m2=value2" http://whatever
。
数据应该是x-www-form-urlencode
格式的。
编辑:尽管这完全与标准相反,但我见过一些情况下,请求正文必须既附加为查询字符串,又传递为表单数据。
LinkedIn API是最显著的例子。