unix HTTP PUT的查询参数的Curl命令行编码

qij5mzcb  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(189)

我有多个查询参数要在HTTP PUT操作中使用curl发送。如何对查询参数进行编码?例如:

$ curl -X PUT http://example.com/resource/1?param1=value%201&param2=value2

如果'value 1'包含空格或shell解释的其他字符,则命令将无法正确分析。

idv4meu8

idv4meu81#

解决方案是将-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是空格字符的编码值。

4urapxun

4urapxun2#

PUT请求实际上与POST请求类似。
您应该使用$ curl -X PUT --data "param1=value1&param2=value2" http://whatever
数据应为x-www-form-urlencode d。
编辑:虽然这完全违反了标准,但我看到过请求主体必须作为查询字符串 * 和 * 作为表单数据传递的示例。
LinkedIn API是最值得注意的。

gstyhher

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"}'

相关问题