[英]curl post JSON file to REST API while also using --data-urlencode to encode query paramater
設定
在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上附加參數,至少要對其中之一進行URL編碼?
解
我發現處理URLEncoding字符串並將其作為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()”。 然后通過它傳遞字符串變量$ datetime以根據需要對日期時間進行編碼。然后將結果字符串變量$ datetimeEncoded傳遞給URL參數datetime = $ datetimeEncoded
問題解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.