卷曲错误18转移关闭,剩余未完成的读取数据

时间:2017-03-11 20:48:50

标签: bash curl

设置

我在以下bash脚本中使用curl将JSON文件推送到位于nginx后面的tomcat中运行的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)

问题

运行此脚本时,我收到带有curl错误的http 400响应:

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

我尝试了什么

我找到了两件事。首先通过Postman运行相同的URL和正文会产生一个成功的POST。

我发现当从网址&datetime=$datetime

中移除最后一个参数时,此错误消失了

我还发现了这个错误与设置像

之类的卷曲选项之间的一些联系
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));

但是我不确定在简单的bash脚本中使用curl时在哪里/如何设置它

问题

我需要在curl命令中更改以消除错误并仍能使用所有参数?

更新

开始一个新问题,因为进一步的调查使我更好地了解了这个问题。

New Question Link

错误与参数datetime =以及需要进行URL编码的文本结束这一事实有关。

通过将变量替换为2017%2F03%2F01%2008%3A50%3A56

来确认

并且有效。

所以现在的问题是,我无法获得--data-urlencode datetime = $ datetime。它似乎只是附加到JSON数据或其他东西。

1 个答案:

答案 0 :(得分:0)

这个错误是由于datetime = paramater正在传入非编码的非URL友好字符...(例如空格)。

解决这个问题的方法是找到一种方法将$ datetime转换为URLEncoded String。

例如。转换:

2017/03/01 08:50:56

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

有关实现此目的的一种方法,请参阅以下讨论。

Post JSON data to Rest with URLEncoded query paramaters