使用 wget 发送 urlencoded POST 请求
Send urlencoded POST request with wget
以下 curl
将发送一个 POST
请求,其中 url
参数自动进行 urlencoded:
u="url=http://somewhere.net?param1=val1¶m2=val2"
curl -XPOST --data-urlencode "$u" http://example.com
但是,我需要从一个没有
curl
已安装。
有没有办法实现与 wget
相同的效果? $u
可以由 wget
或另一个 可能 最小化 linux 安装的程序自动编码吗?
正如@Roadowl 在评论中所建议的那样,bash 本身可以对数据进行 urlencode,wget 调用可能看起来像
wget --post-data=$(printf "url="; urlencode $u) http://example.com
使用 https://gist.github.com/cdown/1163649 中的 urlencode 实现,
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
.. 考虑到 bash 不喜欢空字节并且可能不允许它们出现在变量
中,但空字节可能不起作用
以下 curl
将发送一个 POST
请求,其中 url
参数自动进行 urlencoded:
u="url=http://somewhere.net?param1=val1¶m2=val2"
curl -XPOST --data-urlencode "$u" http://example.com
但是,我需要从一个没有
curl
已安装。
有没有办法实现与 wget
相同的效果? $u
可以由 wget
或另一个 可能 最小化 linux 安装的程序自动编码吗?
正如@Roadowl 在评论中所建议的那样,bash 本身可以对数据进行 urlencode,wget 调用可能看起来像
wget --post-data=$(printf "url="; urlencode $u) http://example.com
使用 https://gist.github.com/cdown/1163649 中的 urlencode 实现,
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
.. 考虑到 bash 不喜欢空字节并且可能不允许它们出现在变量
中,但空字节可能不起作用