设置
我在以下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命令中更改以消除错误并仍能使用所有参数?
更新
开始一个新问题,因为进一步的调查使我更好地了解了这个问题。
错误与参数datetime =以及需要进行URL编码的文本结束这一事实有关。
通过将变量替换为2017%2F03%2F01%2008%3A50%3A56
来确认并且有效。
所以现在的问题是,我无法获得--data-urlencode datetime = $ datetime。它似乎只是附加到JSON数据或其他东西。
答案 0 :(得分:0)
这个错误是由于datetime = paramater正在传入非编码的非URL友好字符...(例如空格)。
解决这个问题的方法是找到一种方法将$ datetime转换为URLEncoded String。
例如。转换:
2017/03/01 08:50:56
要
2017%2F03%2F01%2008%3A50%3A56
有关实现此目的的一种方法,请参阅以下讨论。