2017-03-11 36 views
0

設置捲曲錯誤18傳送關閉以優異的讀取數據剩餘

,我在下面的bash腳本使用捲曲成JSON文件推給Tomcat坐在後面的nginx運行的REST API。

while IFS= read -d '' -r file; do 
base=$(basename "$file") 
datetime=$(find $file -maxdepth 0 -printf "%TY/%Tm/%Td %TH:%TM:%.2TS") 
curl -vX POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" \ 
    -d @"$file" -u vangeeij:eian12 \ 
    "http://192.168.105.10/homeaccess/services/aCStats/uploadData?username=vangeeij&filename=$base&datetime=$datetime" 
#sudo mv "$file" /home/vangeeij/acserver/resultsOld 
done < <(sudo find . -type f -print0) 

問題

運行此腳本,我得到一個HTTP 400響應,捲曲的錯誤:

curl: (18) transfer closed with outstanding read data remaining 

我已經試過

我發現兩件事。首先通過Postman運行相同的URL和主體會生成一個成功的POST。

我發現這個錯誤消失,當最後一個參數從URL刪除&datetime=$datetime

我也發現了這個錯誤,並設置一個捲曲的選項類似

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:')); 

但之間的連接數我不知道在哪裏/如何在一個簡單的bash腳本

問題

使用curl時設置這個確切

我需要改變我的curl命令以擺脫錯誤並仍然能夠使用所有參數?

UPDATE

開始一個新的問題,如進一步調查使我更好地理解了這個問題。

New Question Link

失誤也與參數日期時間=在它的文本需要進行URL編碼結束的事實做。

這是通過與2017年%2F03%2F01%2008%3A50%3A56

更換可變證實和它的工作。

所以現在的問題是,我無法得到--data-urlencode datetime = $ datetime工作。看起來這只是附加到JSON數據或其他東西。

+2

我會嘗試刪除 '\ n' 這一行。 datetime = $(find $ file -maxdepth 0 -printf「%TY /%Tm /%Td%TH:%TM:%。2TS \ n」)。你也可以添加-d「username = vangeeij&filename = $ base&datetime = $ datetime」並從URL中刪除它,因爲curl合併了多個-d的 – Aleksandar

+0

我沒有注意到\ n那裏..我刪除了那個...但是錯誤依然存在。更新以上內容以反映這一點。 – DarbyM

回答

0

這個錯誤是由於datetime = paramater被傳入並帶有非編碼的非URL友好字符(例如空格)而產生的。

解決此問題的方法是找到一種方法將$ datetime轉換爲URLEncoded字符串。

例如。轉換:

2017/03/01 08:50:56 

TO

2017%2F03%2F01%2008%3A50%3A56 

請參見下面的討論一個方法來做到這一點。

Post JSON data to Rest with URLEncoded query paramaters