curl 如何传递多参数并进行urlencode

bravility
  • 239
1.curl进行urlencode的方式为curl --data-urlencode "port=4546&content=hello" www.test.com

但是这样服务器并不能正常获取port和content参数,反而获得的参数是port,值为4546&content=hello

2.curl进行多参数post的方式为curl -d "port=4546&content=哈哈哈" www.test.com

但是这样得到的参数并没有进行url编码,如何得到content为%e5%93%88%e5%93%88%e5%93%88,而不是哈哈哈

3.综上,能否仅用curl就完成多参数的发送(post,get不限)与url编码,如何做?

注:仅限shell命令,若先传数据过去再在服务器进行高级语言的url编码非本问题讨论范围

回复
阅读 30.6k
2 个回答
curl -G --data-urlencode "port=4546" --data-urlencode "content=哈哈哈" www.test.com
CaptainLiao
  • 3
新手上路,请多包涵

对于 get 请求,curl 使用楼上的答案是 OK 的。也就是说,--data-urlencode 能够编码 curl 的 get 请求中文字符。但对于 post 请求却无能为力。

可以编写一个 urlencode.sh 文件:

#!/bin/bash

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
}

echo urlencode 你好世界

%e4%bd%a0%e5%a5%bd%e4%b8%96%e7%95%8c

然后,使用 curl 发送 post 请求,send.sh:

#!/bin/bash

title=$(urlencode 你好)
desc=$(urlencode 世界)

curl --data "title=$title&desc=$desc" "https://www.yourdomain.com"

详见:https://gist.github.com/cdown...

宣传栏