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

26

我有多个查询参数,想在使用curl进行HTTP PUT操作时发送它们。 我该如何对查询参数进行编码? 示例:

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

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

3个回答

53

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

@2Agyu 那么 URL 编码 GET 查询/参数呢?那些是 URL 的一部分,而不是 POST 请求的一部分? - Andrew

1

我想使用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"}'


-1

PUT请求实际上像POST请求一样工作。

您应该使用$ curl -X PUT --data "param1=value1&param2=value2" http://whatever

数据应该是x-www-form-urlencode格式的。

编辑:尽管这完全与标准相反,但我见过一些情况下,请求正文必须既附加为查询字符串,又传递为表单数据。

LinkedIn API是最显著的例子。


如果有人能详细解释为什么要对我的评论进行负评,那将非常有帮助。 - Victor - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接