簡體   English   中英

將JSON文件卷曲到REST API,同時也使用--data-urlencode編碼查詢參數

[英]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

問題解決了。

在此處找到URLEncode腳本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM