我试图通过Bash脚本调用REST-Api(通过curl) - 如果通过脚本调用curl-command(而不是直接通过shell调用它),行为会有所不同。
让我们从API调用开始:
curl -s -X POST http://localhost:8080/SOMETOKEN/sendMessage -d text="test 123" -d param=SOMEPARAM
响应将是一个像这样的json对象(稍微审查一下,text-parameter应该是相关的一个):
{
"ok": true,
"result": {
"message_id": xx,
"from": {
"id": xxx,
"first_name": "xxx",
"username": "xxx"
},
"chat": {
"id": xxx,
"first_name": "xxx",
"type": "private"
},
"date": xxx,
"text": "test 123"
}
}
所以当我从bash-script调用相同的命令时:
#!/bin/bash
. settings
MESSAGE="test 123"
COMMAND='curl -s -X POST http://localhost:8080/"'$TOKEN'"/sendMessage -d text='$MESSAGE' -d param='$PARAM
ANSWER="$($COMMAND)"
RESULT=$?
echo $ANSWER | jq .
执行脚本会生成如下内容:
{
"ok": true,
"result": {
"message_id": xx,
"from": {
"id": xxx,
"first_name": "xxx",
"username": "xxx"
},
"chat": {
"id": xxx,
"first_name": "xxx",
"type": "xxx"
},
"date": xxx,
"text": "\"test"
}
}
我检查了任何差异,但命令完全相同。所以我尝试了一些带引号的变体(并在空格上做了手动urlencode,用%20替换它们):
COMMAND="curl -s -X POST http://localhost:8080/$TOKEN/sendMessage -d text=\"$MESSAGE\" -d param=$PARAM"
COMMAND="curl -s -X POST http://localhost:8080/$TOKEN/sendMessage -d text=$MESSAGE -d param=$PARAM"
嗯,我无法弄清楚这个问题(虽然我对bash脚本很新),所以也许有人可以给我一个提示?
这里也是HTTP-Requests的一些输出,也许有帮助:
直接来自shell:
POST /SOMETOKEN/sendMessage HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.47.0
Accept: */*
Content-Length: 29
Content-Type: application/x-www-form-urlencoded
text=test 123¶m=SOMEPARAM
来自剧本
POST /SOMETOKEN/sendMessage HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.47.0
Accept: */*
Content-Length: 25
Content-Type: application/x-www-form-urlencoded
text=test¶m=SOMEPARAM
POST /SOMETOKEN/sendMessage HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.47.0
Accept: */*
Content-Length: 26
Content-Type: application/x-www-form-urlencoded
text="test¶m=SOMEPARAM
非常欢迎任何提示!提前致谢
丹尼尔
//编辑:
好的,我还没找到相关联的答案(Setting an argument with bash)。如果有人想知道,这些是我使用它的两种解决方案:
url-parameter空格的手动编码:
MESSAGE=${MESSAGE%\"}
MESSAGE=${MESSAGE#\"}
MESSAGE=${MESSAGE/\ /%20}
COMMAND='curl -s -X POST http://localhost:8080/'$TOKEN'/sendMessage -d text='$MESSAGE' -d param='$PARAM
ANSWER="$($COMMAND)"
直接调用命令 - 这里的主要问题是我无法处理curl的stdout输出来处理响应,否则它可以正常工作。
curl -s -X POST https://localhost:8080/"$TOKEN"/sendMessage -d text="$MESSAGE" -d param="$PARAM"
感谢您的帮助!
// EDIT2:
好吧,终于明白了!
ANSWER=`curl -s -X POST https://localhost:8080/"$TOKEN"/sendMessage -d text="$MESSAGE" -d param="$PARAM"`
RESULT=$?
echo $ANSWER | jq .