【问题标题】:Scripted concatenation of strings in curl command payloadcurl 命令有效负载中字符串的脚本连接
【发布时间】:2018-05-30 20:39:58
【问题描述】:

我使用curl 来测试一个用户帐户创建API,如下所示:

curl -s -X POST "https://$APISERVER/users" \
-H 'Content-Type: application/json' \
-d '{ \
"username": "'$NEWUSERNAME'", \
"firstName": "'$NEWUSERFIRSTNAME'", \
"lastName": "'$NEWUSERLASTNAME'", \
"displayName": "'$NEWUSERDISPLAYNAME'", \
"password": "'$NEWUSERPASSWORD'" \
}'

变量是通过命令行参数提供的:

APISERVER=http://localhost:8080
NEWUSERNAME=$1
NEWUSERPASSWORD=$2
NEWUSERFIRSTNAME=$3
NEWUSERLASTNAME=$4

# Calculated variable
NEWUSERDISPLAYNAME="${NEWUSERFIRSTNAME} ${NEWUSERLASTNAME}"

脚本调用示例如下:./test-new-user.sh jdoe Hello123 John Doe,产生以下变量值:

NEWUSERNAME=jdoe
NEWUSERPASSWORD=Hello123
NEWUSERFIRSTNAME=John
NEWUSERLASTNAME=Doe

(我打算将 NEWUSERDISPLAYNAME 设置为“John Doe”)

但我从服务器返回了一个异常,因为curl 命令中的有效负载似乎被切断、不完整或格式错误。

JSON parse error: Unexpected end-of-input in VALUE_STRING\n at [Source: 
java.io.PushbackInputStream@2eda6052; line: 1, column: 293]; nested 
exception is com.fasterxml.jackson.databind.JsonMappingException: 
Unexpected end-of-input in VALUE_STRING\n at [Source: 
java.io.PushbackInputStream@2eda6052; line: 1, column: 293]\n at 
[Source: java.io.PushbackInputStream@2eda6052; line: 1, column: 142] 
(through reference chain: 
com.mycompany.api.pojos.NewUser[\"displayName\"])"

如果我在上述 curl 命令中硬编码 displayName 的值(如下所示),则用户创建请求将通过并完美运行。

"displayName": "John Doe", \

我怀疑这与displayName 中的空格以及我如何使用"'$NEWUSERDISPLAYNAME'" 插入displayName 的值有关。在curl 命令的 POST 请求负载中执行变量替换是否有安全的方法?

【问题讨论】:

    标签: bash shell curl string-concatenation


    【解决方案1】:

    你需要引用shell变量:

    curl -s -X POST "https://$APISERVER/users" \
    -H 'Content-Type: application/json' \
    -d '{ \
    "username": "'"$NEWUSERNAME"'", \
    "firstName": "'"$NEWUSERFIRSTNAME"'", \
    "lastName": "'"$NEWUSERLASTNAME"'", \
    "displayName": "'"$NEWUSERDISPLAYNAME"'", \
    "password": "'"$NEWUSERPASSWORD"'" \
    }'
    

    为了避免过度引用,试试这个printf

    printf -v json -- '{ "username": "%s", "firstName": "%s", "lastName": "%s", "displayName": "%s", "password": "%s" }' \
    "$NEWUSERNAME" "$NEWUSERFIRSTNAME" "$NEWUSERLASTNAME" "$NEWUSERDISPLAYNAME" "$NEWUSERPASSWORD"
    
    curl -s -X POST "https://$APISERVER/users" \
        -H 'Content-Type: application/json' \
        -d "$json"
    

    【讨论】:

    • 是的,这行得通。谢谢!不过,所有其他变量都可以替代。正是这个在价值上有一个空间。有没有更好的方法来做到这一点,或者使用花括号表示法,使其更具可读性?因为双单双引号的使用让人困惑。
    【解决方案2】:

    随便用

    $(echo $varname)

    为我工作

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2021-12-27
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多