一、问题描述

先说下问题背景,最近在写的一个程序在通过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