shell实现urlencode和urldecode

2019年11月11日 发表评论 阅读评论

一、问题描述

先说下问题背景,最近在写的一个程序在通过restful API 在以form方式post提交时,发现其中的特殊符号无法提交进行后台,后台这边报错error on parse multipart form array: invalid URL escape "%",而后台数据查询该条数据的该项值没有录入。这里需要传入的数据其实就是df 输出的数据,这里直接通过curl 报异常的是Use%这一项。这一项的百分号属于特殊符号。

二、解决方法

1、使用curl --data-urlencode参数

该参数会将对应的数据进行urlencode转换,默认是POST请求使用,GET请求可以配合-G参数使用,对应的示例如下:

curl -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,估计是后端程序没法正常找到分割符号&,导到无法正常入库。该问题如何解决呢?可以把每个参数单独设置转码,这里我以两个参数为例,如下:

curl -v -L --data-urlencode "hostname=361way.com" --data-urlencode  "usepercent=58%" http://10.212.52.14:3000/nfs

这样就可以正常入库了,不过需要注意的是目前大部分版本的curl都是支持data-urlencode的,不过在一些低版本里是不支持的,比如SUSE10。

2、脚本转码

由于我们传入的内容,知道是在百分比这一项出的问题,所以我们就把百分比这项,使用命令转码,其他部分仍保持原样后,再拼接起来。

urlencode方法

echo '手机' | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g'
echo '手机' |tr -d '\n' |od -An -tx1|tr ' ' %
输出:
%ca%d6%bb%fa

urldecode方法

url="http://www.baidu.com/s?wd=%ca%d6%bb%fa"
printf $(echo -n $url | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n"
输出:
http://www.baidu.com/s?wd=手机

所以对应的我们上面post的脚本可以修改为:

ipaddr=`curl http://10.212.149.204/myip`
df -t nfs -hP|sed 's/[:%]/ /g'|awk 'NR>1{print $0}' | while read nasip naslun size used avail usepercent mounted
do
   percent=echo $usepercent | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g'
   data=hostname=$HOSTNAME&ipaddr=$ipaddr&nasip=$nasip&naslun=$naslun&size=$size&used=$used&avail=$avail&usepercent=$percent&mounted=$mounted
   curl -d $data http://10.212.52.14:3000/nfs
fs
done




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 2020年5月27日11:16 | #1