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

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编码非本问题讨论范围

阅读 39.1k
2 个回答
curl -G --data-urlencode "port=4546" --data-urlencode "content=哈哈哈" www.test.com

对于 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...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏