curl脚本

时间:2016-11-19 00:47:11

标签: linux bash shell http curl

我试图通过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&param=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&param=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&param=SOMEPARAM

非常欢迎任何提示!提前致谢

丹尼尔

//编辑:

好的,我还没找到相关联的答案(Setting an argument with bash)。如果有人想知道,这些是我使用它的两种解决方案:

  1. 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)"
    
  2. 直接调用命令 - 这里的主要问题是我无法处理curl的stdout输出来处理响应,否则它可以正常工作。

    curl -s -X POST https://localhost:8080/"$TOKEN"/sendMessage -d text="$MESSAGE" -d param="$PARAM"
    
  3. 感谢您的帮助!

    // EDIT2:

    好吧,终于明白了!

    ANSWER=`curl -s -X POST https://localhost:8080/"$TOKEN"/sendMessage -d text="$MESSAGE" -d param="$PARAM"`
    RESULT=$?
    echo $ANSWER | jq .
    

0 个答案:

没有答案