首页 > 解决方案 > 使用 wget 发送 urlencoded POST 请求

问题描述

以下curl将发送一个带有自动 urlencoded 参数的POST请求:url

u="url=http://somewhere.net?param1=val1&param2=val2"
curl -XPOST --data-urlencode "$u" http://example.com

但是,我需要从尚未 curl安装的系统发出此请求。

有没有办法达到同样的效果wget?可以由或其他可能在最小 linux 安装上的程序$u自动进行 urlencoded吗?wget

标签: bashcurlpostwget

解决方案


正如@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 不喜欢空字节并且可能不允许它们出现在变量中,空字节可能不起作用


推荐阅读