Bash shell 使用 CURL urlencode 送參數

Bash shell 想要送中文等需要被 urlencode 過的文字到網址去,要怎麼做呢?

此篇使用 curl 直接傳送,另外在紀錄 Bash 的 urlencode() / urldecode() 寫法

Bash shell 使用 CURL urlencode 送參數

CURL 想要做 urlencode,需要搭配 --data-urlencode 的參數(--data-urlencode 需要另外搭配 -G),另外不需要 encode 的,一樣可以帶在網址後面即可。

直接看範例比較容易懂,下述範例要傳送三個參數:msg、text、channel,channel 不需要 urlencode,先直接帶在後面即可。

  • curl -X GET -G --data-urlencode "msg=abcs" --data-urlencode "text=中文" "http://example.com/?channel=blog"
  • 註:若需要 POST,則 -X POST,所有參數都需要加到 --data-urlencode 去。

若不使用 curl,想要於 Bash shell 直接轉譯傳送,下面有兩種 urlencode() 的寫法(將下述寫入 .bashrc 即可),自行挑其一使用:

Bash shell 使用 curl 來達成 urlencode 所需命令

function urlencode() {
    local data
    if [[ $# != 1 ]]; then
        echo "Usage: $0 string-to-urlencode"
        return 1
    fi
    data="$(curl -s -o /dev/null -w %{url_effective} --get --data-urlencode "$1" "")"
    if [[ $? != 3 ]]; then
        echo "Unexpected error" 1>&2
        echo "${data##/?}"
    return 0
}

使用方式

  • $ echo http://example.com/q?=$( urlencode "中文" )

Bash shell 的 urlencode() / urldecode()

下述整理自此篇:Bash urlencode and urldecode # 註:此篇最上面的不能用,往下翻的才有正確能用的版本

Bash shell 使用 xxd 來達成 urlencode 所需計算

function urlencode() {
    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 "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
        esac
    done
}
function urldecode() {
    # urldecode <string>

    local url_encoded="${1//+/ }"
    printf '%b' "${url_encoded//%/\\x}"
}

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料