shell实现urlencode和urldecode
一、问题描述
先说下问题背景,最近在写的一个程序在通过restful API 在以form方式post提交时,发现其中的特殊符号无法提交进行后台,后台这边报错error on parse multipart form array: invalid URL escape “%”,而后台数据查询该条数据的该项值没有录入。这里需要传入的数据其实就是df 输出的数据,这里直接通过curl 报异常的是Use%这一项。这一项的百分号属于特殊符号。
二、解决方法
1、使用curl –data-urlencode参数
该参数会将对应的数据进行urlencode转换,默认是POST请求使用,GET请求可以配合-G参数使用,对应的示例如下:
1curl -v -L --data-urlencode "hostname=361way.com&ipaddr=10.211.57.136&nasip=192.168.17.55&naslun=/vx/ydxx&size=999G&used=559G&avail=413G&usepercent=58%&mounted=/ydxx" http://10.212.52.14:3000/nfs
不过这个方法我在使用时发现,只有hostname这项能正常入库,后面的内容由于转码的原因把&转换为了%26,估计是后端程序没法正常找到分割符号&,导到无法正常入库。该问题如何解决呢?可以把每个参数单独设置转码,这里我以两个参数为例,如下:
1curl -v -L --data-urlencode "hostname=361way.com" --data-urlencode "usepercent=58%" http://10.212.52.14:3000/nfs
这样就可以正常入库了,不过需要注意的是目前大部分版本的curl都是支持data-urlencode的,不过在一些低版本里是不支持的,比如SUSE10。
2、脚本转码
由于我们传入的内容,知道是在百分比这一项出的问题,所以我们就把百分比这项,使用命令转码,其他部分仍保持原样后,再拼接起来。
urlencode方法
1echo '手机' | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g'
2echo '手机' |tr -d '\n' |od -An -tx1|tr ' ' %
3输出:
4%ca%d6%bb%fa
urldecode方法
1url="http://www.baidu.com/s?wd=%ca%d6%bb%fa"
2printf $(echo -n $url | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n"
3输出:
4http://www.baidu.com/s?wd=手机
所以对应的我们上面post的脚本可以修改为:
1ipaddr=`curl http://10.212.149.204/myip`
2df -t nfs -hP|sed 's/[:%]/ /g'|awk 'NR>1{print $0}' | while read nasip naslun size used avail usepercent mounted
3do
4 percent=echo $usepercent | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g'
5 data=hostname=$HOSTNAME&ipaddr=$ipaddr&nasip=$nasip&naslun=$naslun&size=$size&used=$used&avail=$avail&usepercent=$percent&mounted=$mounted
6 curl -d $data http://10.212.52.14:3000/nfs
7fs
8done
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/shell-urlencode/6387.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.