将JSON文件发布到REST API,同时使用--data-urlencode对查询参数

时间:2017-03-12 04:09:41

标签: json bash rest curl post

设置

在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?

1 个答案:

答案 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

问题解决了。

URLEncode script found here

相关问题