我有多个查询参数要在HTTP PUT操作中使用curl发送。如何对查询参数进行编码?例如:
$ curl -X PUT http://example.com/resource/1?param1=value%201¶m2=value2
如果'value 1'包含空格或shell解释的其他字符,则命令将无法正确分析。
idv4meu81#
解决方案是将-G开关与--data-urlencode开关结合使用。使用原始示例,该命令如下所示:
-G
--data-urlencode
$ 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是空格字符的编码值。
?
param1
value%201
4urapxun2#
PUT请求实际上与POST请求类似。您应该使用$ curl -X PUT --data "param1=value1¶m2=value2" http://whatever数据应为x-www-form-urlencode d。编辑:虽然这完全违反了标准,但我看到过请求主体必须作为查询字符串 * 和 * 作为表单数据传递的示例。LinkedIn API是最值得注意的。
$ curl -X PUT --data "param1=value1¶m2=value2" http://whatever
x-www-form-urlencode
gstyhher3#
我想使用URL编码的查询参数和body/payload(在我的例子中,是JSON)。似乎让curl做到这一点的唯一方法是提供一个包含编码的查询字符串的URL-换句话说,自己对查询参数进行URL编码。Sergey和Bruno对最后一部分给出了一个很好的回答:https://stackoverflow.com/a/10797966/19632250把这些放在一起变成有用的东西,我得到了下面的脚本。
# !/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"}'
3条答案
按热度按时间idv4meu81#
解决方案是将
-G
开关与--data-urlencode
开关结合使用。使用原始示例,该命令如下所示:-G
开关使使用--data-urlencode
开关编码得参数附加到http URL得末尾,并使用?
分隔符.在此示例中,
param1
的值将编码为value%201
,其中%20是空格字符的编码值。4urapxun2#
PUT请求实际上与POST请求类似。
您应该使用
$ curl -X PUT --data "param1=value1¶m2=value2" http://whatever
数据应为
x-www-form-urlencode
d。编辑:虽然这完全违反了标准,但我看到过请求主体必须作为查询字符串 * 和 * 作为表单数据传递的示例。
LinkedIn API是最值得注意的。
gstyhher3#
我想使用URL编码的查询参数和body/payload(在我的例子中,是JSON)。似乎让curl做到这一点的唯一方法是提供一个包含编码的查询字符串的URL-换句话说,自己对查询参数进行URL编码。
Sergey和Bruno对最后一部分给出了一个很好的回答:https://stackoverflow.com/a/10797966/19632250
把这些放在一起变成有用的东西,我得到了下面的脚本。