2

我编写了一个烟雾测试脚本,它使用 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

结果输出:

输出:505
输出 2:200

因此,第一次调用失败(HTTP 返回码 505,不支持 HTTP 版本),第二次调用成功(返回码“OK”)。

为什么第一次通话失败,我该如何解决? 我已经验证他们应该执行相同的命令(在 echo 中评估)。我确信我缺少一些基本的东西,因为我现在正在学习 Bash 脚本。

4

2 回答 2

1

包围的单引号Content-Type:Application/xml,因为它们在值中被引用URL被视为文字引号,并且$URL在该调用中扩展时不会被删除curl。因此,您传递的 HTTP 标头无效。只需使用

URL="/activation/v2/activationInfo --header Content-Type:Application/xml"
OUTPUT=`curl -sL -m 30 -w "%{http_code}" -o /dev/null $RESTHOST$URL -d @"./activation_post.txt" -X POST`

但是,依靠这样的分词将调用的两个单独部分组合curl在一个变量中并不是一个好主意。尝试这样的事情:

URLPATH="activation/v2/activationInfo"
HEADERS=("--header" "Content-Type:Application/xml")
OUTPUT=$( curl -SL -m 30 -w "%{http_code}" -o /dev/null "$RESTHOST/$URL" "${HEADERS[@]}"  -d @'./activation_post.txt' -X POST )
于 2013-06-08T22:35:12.337 回答
1

我想我找到了问题所在!它是由IFS=$'\n'! 因此,变量扩展无法按预期工作。它不允许拆分 URL 字符串中指定的参数!

因此SERVER_PROTOCOL,服务器端的变量将设置为“--header Content-Type:Application/xml HTTP/1.1”而不是“HTTP/1.1”,并且CONTENT_TYPE将是“application/x-www-form-urlencoded” ' 而不是 '应用程序/xml'。

要详细显示问题的根源:

VAR="Solaris East"
printf "+%s+ " $VAR
echo "==="
IFS=$'\n'
printf "+%s+ " $VAR

输出:

+Solaris+ +East+ ===
+Solaris East+ 

所以$VAR扩展没有按预期工作,因为IFS=$'\n'

解决方法:不要在 URL 中使用IFS=$'\n'和替换空格%20

URL=${URL2// /%20}" --header Content-Type:Application/xml"

在这种情况下,您的第一个调用将正常工作!

如果您仍然在命令行中使用IFS=$'\n'并给出选项,如果包含空格,它将无法正常工作,因为服务器将无法处理它(我在上测试过)!--headerURL

即使你仍然不能使用HEADER="--header Content-Type:Application/xml",因为扩展$HEADER会导致的一个(!)参数,--header Content-Type:Application/xml而不是将它们分成两个。

所以我可能建议将 URL 中的空格替换为%20无论如何!

于 2013-06-11T09:39:33.700 回答