2017-03-12 14 views
0

設置捲曲後JSON文件同時還採用--data-進行urlencode編碼查詢paramater到REST API

在bash腳本我使用捲曲的JSON文件的內容POST到一個RESTful API在nginx後面的tomcat上運行。

此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) 

結果/問題

如可以在從捲曲的輸出中可以看出,該URL不具有附托特他的網址

* 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 

的端日期時間=參數問題

什麼是正確的語法來完成我在這裏嘗試。將URL的JSON文件的POST POST參數附加到URL,其中至少有一個是URLEncoded?

+0

應該不是'日期時間= $ datatime'是URL查詢字符串作爲'&日期時間= $ datetime'的一部分,如果你想將它傳遞給服務器? – hcheung

+0

正確..但如前所述,$ datetime需要URLEncoded其他方式它會導致問題做空格和特殊字符。因此試圖利用捲曲函數--data-urlencode。 – DarbyM

+0

好吧,我建議在文件中使用'--trace-ascii my-trace.txt',您將看到捲曲在線上發送的內容。請讓我們看看my-trace.txt,謝謝。 – Aleksandar

回答

0

解決方案

我發現處理URL編碼字符串,並把它當作在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 script found here