设置
在Bash脚本中,我使用curl将JSON文件的内容发布到在nginx后面的tomcat上运行的RESTful API。
此POST还需要在URL末尾有3个不同查询参数的基本身份验证。
while IFS= read -d '' -r file; do
base=$(basename "$file")
datetime=$(find $file -maxdepth 0 -printf "%TY/%Tm/%Td %TH:%TM:%.2TS")
username="vangeeij"
curl -vX POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" \
-u username:password \
-d @"$file" \
"http://192.168.105.10/homeaccess/services/aCStats/uploadData?username=$username&filename=$base" \
--data-urlencode datetime=$datetime
#sudo mv "$file" /home/vangeeij/acserver/resultsOld
done < <(sudo find . -type f -print0)
结果/问题
从curl的输出中可以看出,URL没有附加到URL末尾的datetime =参数
* Connected to 192.168.105.10 (192.168.105.10) port 80 (#0)
* Server auth using Basic with user 'username'
> POST /homeaccess/services/aCStats/uploadData?username=username&filename=2017_3_1_8_50_RACE.json HTTP/1.1
> Host: 192.168.105.10
问题
完成我在这里尝试的正确语法是什么。将JSON文件的POST压缩到URL,并附带URL的参数,其中至少有一个是URLEncoded?
答案 0 :(得分:0)
<强>解决方案强>
我发现最简单的方法来处理URLE编码字符串的过程,并将其作为URL中的参数传递,以修改我的脚本如下。
#!/bin/bash
cd /home/vangeeij/acserver/results
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
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 '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
while IFS= read -d '' -r file; do
base=$(basename "$file")
datetime=$(find $file -maxdepth 0 -printf "%TY/%Tm/%Td %TH:%TM:%.2TS")
datetimeEncoded=$(urlencode "$datetime")
username="username"
curl -vX POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" \
-u username:password \
-d @"$file" \
"http://192.168.105.10/homeaccess/services/aCStats/uploadData?username=$username&filename=$base&datetime=$datetimeEncoded"
sudo mv "$file" /home/vangeeij/acserver/resultsOld
done < <(sudo find . -type f -print0)
简答
我添加了函数“urlencode()”。然后通过它传递String变量$ datetime以根据需要对日期时间进行编码。然后将生成的String变量$ datetimeEncoded传递给URL参数datetime = $ datetimeEncoded
问题解决了。