我编写了一个冒烟测试脚本,它使用 BASH 脚本和 Curl 来测试我们正在开发的 RESTful Web 服务。该脚本读取文件,并将每一行解释为 URL 后缀和 Curl REST 调用的参数。
不幸的是,当我将脚本改编为运行 HTTP POST 调用以及 GET 调用时,该脚本给出了意外结果。与在脚本中运行命令相比,它不会给出相同的结果:
BASH 脚本:
IFS=$'\n' #Don't split an input URL line at spaces
RESTHOST='hostNameAndPath' #Can't give this out
URL="/activation/v2/activationInfo --header 'Content-Type:Application/xml'"
URL2="/activation/v2/activationInfo"
OUTPUT=`curl -sL -m 30 -w "%{http_code}" -o /dev/null $RESTHOST$URL -d @"./activation_post.txt" -X POST`
echo 'out:' $OUTPUT
OUTPUT2=`curl -sL -m 30 -w "%{http_code}" -o /dev/null $RESTHOST$URL2 --header 'Content-Type:Application/xml' -d @'./activation_post.txt' -X POST`
echo 'out2:' $OUTPUT2
结果:
out: 505
out2: 200
因此,第一次调用失败(HTTP 返回代码 505,不支持 HTTP 版本),第二次调用成功(返回代码“OK”)。 p>
为什么第一次调用失败,如何修复它?我已经验证它们应该执行相同的命令(在 echo 中评估)。我确信我缺少一些基本的东西,因为我现在正在学习 Bash 脚本。
最佳答案
我想我已经找到问题了!这是由IFS=$'\n'
引起的!因此,变量扩展无法按预期工作。它不允许分割 URL 字符串中指定的参数!
因此,服务器端的 SERVER_PROTOCOL
变量将设置为“--header Content-Type:Application/xml HTTP/1.1”而不是“HTTP/1.1”,并且 CONTENT_TYPE
将是“application/x-www-form-urlencoded”而不是“Application/xml”。
详细显示问题的根源:
VAR="Solaris East"
printf "+%s+ " $VAR
echo "==="
IFS=$'\n'
printf "+%s+ " $VAR
输出:
+Solaris+ +East+ ===
+Solaris East+
因此,由于 IFS=$'\n'
,$VAR
扩展无法按预期工作!
解决方案:不要使用 IFS=$'\n'
并将 URL 中的空格替换为 %20
!
URL=${URL2// /%20}" --header Content-Type:Application/xml"
在这种情况下,您的第一个 curl 调用将正常工作!
如果您仍然使用 IFS=$'\n'
并在命令行中提供 --header
选项,则 URL
将无法正常工作code> 包含空格,因为服务器将无法处理它(我在 apache 上测试过)!
即使您仍然无法使用 HEADER="--header Content-Type:Application/xml"
因为扩展 $HEADER
将导致 curl 的一个(!)参数,即 --header Content-Type:Application/xml
而不是将它们分成两部分。
所以我可能建议将 URL 中的空格替换为 %20
!
关于bash - 为什么对 REST 服务的 bash/CURL 调用会给出与参数不一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17001369/