如何在 CURL 命令中传递 POST JSON 数据中的变量值?

how to pass variable value in POST JSON data in CURL command?

有两个字段是唯一的,所以我写了一个命令来在每次构建 POST 方法时生成随机值,并将这些值存储到变量中,并在 CURL 命令行中传递这些变量。脚本如下。

    rcontactno=$(cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -n 1)
    rfirstname=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 10 | head -n 
    echo $rcontactno and $rfirstname
    STATUS=$(curl -v -X POST -d '{"userName":"$rfirstname","contactNo":$rcontactno}' /restaurants/53/managers --header "Content-Type:application/json" --header "Accept:application/json" | grep HTTP | cut -d ' ' -f2 )
#Passing the URL using command-line argument    
if [[ STATUS -eq 201 ]]; then
    echo “Success”
    exit 0
    else
    echo “Failed”
    exit 127
    fi

然后我通过

执行脚本

bash manager-post.sh

我遇到这种类型的错误

  > POST /restaurants/53/managers HTTP/1.1
    > User-Agent: curl/7.37.1
    > Host: my-url
    > Content-Type:application/json
    > Accept:application/json
    > Content-Length: 54
    > 
    } [data not shown]
    * upload completely sent off: 54 out of 54 bytes
    < HTTP/1.1 400 Bad Request
    * Server Apache-Coyote/1.1 is not blacklisted
    < Server: Apache-Coyote/1.1
    < Content-Type: application/json;charset=UTF-8
    < Transfer-Encoding: chunked
    < Date: Fri, 16 Jan 2015 08:59:01 GMT
    < Connection: close
    < 
    { [data not shown]
    * Closing connection 0
    “Failed”

但是当我 运行 没有 bash 脚本的 curl 命令并明确提及 userName 和 contactNo 的值时,它将成功执行。

我哪里出错了?

单引号不允许在shell中进行变量扩展,因此您需要改用双引号。然后您需要随后转义要按原样发送的双引号。

一种有用的调试技术是将 --trace-ascii dump.txt 添加到您的命令行并在调用 curl 后检查 dump.txt 以查看它是否与您打算发送的内容相匹配。