bash - 为什么对 REST 服务的 bash/CURL 调用会给出与参数不一致的结果?

标签 bash rest curl

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

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

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

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

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

关于bash - 为什么对 REST 服务的 bash/CURL 调用会给出与参数不一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17001369/

相关文章:

linux - 用于搜索设备 ID 的 bash 脚本

java - 如何在 ClientConfig 上注册 JacksonFeature

c++ - 链接错误 C++ Libcurl

c++ - CURL - 未知表单选项

http - -D- curl参数

linux - 为什么它不起作用?如果bash中的指令

linux - 将命令输出保存在保留换行符的字符串变量中

android - .bash_profile 破坏了我的路径,但是 .bashrc

javascript - 公司如何保护 JavaScript 客户端库的安全?

javascript - 创建包含 javascript POST 操作的动态网页